Я хочу выполнить две команды в консоли Windows CMD.
В Linux я бы сделал это так
touch thisfile ; ls -lstrh
Как это делается в Windows?
Я хочу выполнить две команды в консоли Windows CMD.
В Linux я бы сделал это так
touch thisfile ; ls -lstrh
Как это делается в Windows?
Как и во всех Microsoft-операционных системах с 2000 года, и сегодня все еще хорошо:
dir & echo foo
Если вы хотите, чтобы вторая команда выполнялась только в том случае, если первая успешно завершилась успешно:
dir && echo foo
Синтаксис одиночного амперсанда (&) для выполнения нескольких команд в одной строке возвращается к Windows XP, Windows 2000 и некоторым более ранним версиям NT. (По крайней мере, по словам одного комментатора здесь.)
В этом есть немало других моментов, которые вы можете прокрутить по этой странице.
Исторические данные следует за теми, кто может найти это образование.
До этого, && синтаксис был только функцией замены оболочки 4DOS, прежде чем эта функция была добавлена в интерпретатор команд Microsoft.
В Windows 95, 98 и ME вместо этого вы должны использовать символ pipe:
dir | echo foo
В MS-DOS 5.0 и более поздних версиях, в некоторых более ранних версиях интерпретатора команд Windows и NT разделитель команд (недокументированный) был символом 20 (Ctrl + T), который я буду представлять здесь с помощью ^ T.
dir ^T echo foo
Цитата из документации:
Использование нескольких команд и условной обработки символов
Вы можете запустить несколько команд из одной командной строки или сценария, используя условные символы обработки. Когда вы запускаете несколько команд с символами условной обработки, команды справа от символа условной обработки действуют на основе результатов команды слева от символа условной обработки.
Например, вы можете выполнить команду только в случае сбоя предыдущей команды. Или вы можете запустить команду, только если предыдущая команда была успешной.
Вы можете использовать специальные символы, перечисленные в следующей таблице, для передачи нескольких команд.
& [...]
command1 & command2
Используется для разделения нескольких команд в одной командной строке. Cmd.exe запускает первую команду, а затем вторую команду.
&& [...]
command1 && command2
Используйте для запуска команды, следующей за &&, только если команда, предшествующая символу, успешна. Cmd.exe запускает первую команду, а затем запускает вторую команду, только если первая команда выполнена успешно.
|| [...]
command1 || command2
Используйте для запуска команды, следующей за || только если команда предшествует || выходит из строя. Cmd.exe запускает первую команду, а затем запускает вторую команду только в том случае, если первая команда не выполнена успешно (получает код ошибки больше нуля).
( ) [...]
(command1 & command2)
Используйте для группировки или вложения нескольких команд.
; or ,
command1 parameter1;parameter2
Используйте для разделения параметров команды.
&
- эквивалент Bash для ;
(команды запуска), а &&
- эквивалент Bash &&
(запуск команд только тогда, когда предыдущий не вызвал ошибку).
Вы можете использовать и запускать команды один за другим. Пример: c:\dir & vim myFile.txt
Если вы хотите создать ярлык cmd (например, на рабочем столе), добавьте параметр /k (/k означает keep,/c закроет окно):
cmd /k echo hello && cd c:\ && cd Windows
Вы можете использовать вызов для решения проблемы слишком быстро оцениваемых переменных среды - например,
set A=Hello & call echo %A%
Итак, я пытался включить конкретную задачу запуска RegAsm
(сборка регистров) из контекстного меню. Проблема была в том, что результат вспыхнет и исчезнет, прежде чем я смогу его прочитать. Поэтому я попытался подключиться к Pause
, который не работает, когда команда не работает (как указано здесь команда Pause не работает в .bat script и здесь Пакетная команда PAUSE не работает). Поэтому я попробовал cmd /k
, но это оставляет окно открытым для большего количества команд (я просто хочу прочитать результат). Поэтому я добавил в цепочку Pause
, а затем exit
, в результате получилось следующее:
cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit
Это работает как шарм - RegAsm работает над файлом и показывает его результаты, затем отображается приглашение "Нажмите любую клавишу, чтобы продолжить...", после чего окно командной строки закрывается при нажатии клавиши.
P.S. Для других, которым может быть интересно, вы можете использовать следующие записи в файле .reg, чтобы добавить ассоциацию dllfile в файлы .dll, а затем к ней добавьте расширение команды RegAsm (обратите внимание на экранированные кавычки и обратную косую черту):
[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"
[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm]
@="Register Assembly"
[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm\command]
@="cmd /k C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe \"%1\" /codebase \"%1\" & pause & exit"
Теперь у меня есть приятное контекстное меню для регистрации сборки.
Число символов обработки может использоваться при запуске нескольких команд в одной строке и может привести к переадресации обработки в некоторых случаях, изменение результата в другом случае или просто сбой. Одним из важных случаев является размещение в тех же командах строки, которые управляют переменными.
@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!
0 1
Как вы видите в приведенном выше примере, когда команды с использованием переменных помещаются в одну строку, вы должны использовать задержанное расширение для обновления значений переменных. Если ваша переменная индексируется, используйте команду CALL с модификаторами %%, чтобы обновить ее значение в той же строке:
set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%
path5=C:\Users\UserName\AppData\Local\Temp\MyFile5
cmd /c ipconfig /all & Output.txt
Эта команда выполняет команду и открывает файл Output.txt
в одной команде
Чтобы одновременно выполнить две команды, вы должны поместить символ a и (амперсанд) между двумя командами. Например:
color 0a & start chrome.exe
Ура!
Я пытаюсь иметь два пинга в одном окне, и это последовательная команда в той же строке. После завершения первого выполните вторую команду.
Решение должно было сочетаться с start /b
в командной строке Windows 7.
Начать, как обычно, без /b
и запустить в отдельном окне.
Команда, запускаемая в той же строке:
start /b command1 parameters & command2 parameters
В любом случае, если вы хотите проанализировать вывод, я не рекомендую его использовать. Я заметил, что выходной сигнал скремблируется между выходом команд.
У вас есть два варианта: Piping или просто &
:
DIR /S & START FILE.TXT
Или
tasklist | find "notepad.exe"
Трубопровод (|
) больше подходит для вывода одной команды и помещает ее в другую. И (&
) просто говорит, что запустите это, и это.
Нет, cd / && tree && echo %time%
. Время, на которое выполняется эхо-сигнал, находится при первой команде.
У трубопровода есть некоторые проблемы, но это не критично, если люди знают, как это работает.
Еще один пример: например, когда мы используем систему сборки gulp
вместо
gulp
- default > build
gulp build
- построить сборку
gulp watch
- начать просмотр файлов
gulp dist
- создать папку dist
Мы можем сделать это с одной строкой:
cd c:\xampp\htdocs\project & gulp & gulp watch
Это просто: просто различать их с && знаки. Пример:
echo Hello World && echo GoodBye World
Goodbye World будет напечатан после Hello World.
Когда вы пытаетесь использовать или манипулировать переменными в одной строке, остерегайтесь их содержимого! Например. переменная, подобная следующей
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
может привести к большому количеству неприятностей, если вы используете его как %PATH%
%PATH%
для обработки задачи круглых скобок%USERPROFILE%
?Да, есть. Это &.
&& выполнит команду 2, когда команда 1 будет выполнена, при условии, что она не завершилась.
& будет выполняться независимо.