Я хочу запустить две команды в консоли CMD Windows.
В 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
Цитата из документации:
Использование нескольких команд и условных символов обработки
Вы можете запускать несколько команд из одной командной строки или script с использованием условных символов обработки. Когда вы запускаете несколько команд с условными символами обработки, команды справа от символа условной обработки действуют на основании результатов команды слева от символа условной обработки.
Например, вы можете запустить команду только в случае сбоя предыдущей команды. Или вы можете запустить команду только в том случае, если предыдущая команда выполнена успешно.
Вы можете использовать специальные символы, перечисленные в следующей таблице, для передачи нескольких команд.
& [...]
command1 & command2
Используйте для разделения нескольких команд в одной командной строке. Cmd.exe запускает первую команду, а затем вторую команду.
&& [...]
command1 && command2
Используйте для запуска команды, следующей за && только если команда, предшествующая символу, успешна. Cmd.exe запускает первую команду, а затем запускает вторую команду только в том случае, если первая команда успешно завершена.
|| [...]
command1 || command2
Используйте для запуска команды, следующей за || только если команда, предшествующая || выходит из строя. Cmd.exe запускает первую команду, а затем запускает вторую команду только в том случае, если первая команда не завершилась успешно (получает код ошибки больше нуля).
( ) [...]
(command1 & command2)
Использовать для группировки или размещения нескольких команд.
; or ,
command1 parameter1;parameter2
Используйте для разделения параметров команды.
cmd /c "echo foo & echo bar"
.
&
- эквивалент Bash для ;
(команды запуска), а &&
- эквивалент Bash &&
(запуск команд только тогда, когда предыдущий не вызвал ошибку).
;
раньше в линуксе
;
означает выполнить первую команду, дождаться ее завершения, а затем запустить вторую команду. &
означает запустить первую команду, перевести ее в фоновый режим и запустить вторую команду. Таким образом, обе программы запускаются одновременно. Обратите внимание, что они не объединяют символы, они являются конечными символами первой команды; Вы можете запустить одну команду в фоновом режиме с помощью progname &
без второй команды.
Вы можете использовать и запускать команды один за другим. Пример: c:\dir & vim myFile.txt
Если вы хотите создать ярлык cmd (например, на рабочем столе), добавьте параметр /k (/k означает keep,/c закроет окно):
cmd /k echo hello && cd c:\ && cd Windows
Вы можете использовать вызов для решения проблемы слишком быстро оцениваемых переменных среды - например,
set A=Hello & call echo %A%
echo
выводит старое значение, а не новое значение. По крайней мере, это то, что я наблюдаю на моем Windows 7.
Число символов обработки может использоваться при запуске нескольких команд в одной строке и может привести к переадресации обработки в некоторых случаях, изменение результата в другом случае или просто сбой. Одним из важных случаев является размещение в тех же командах строки, которые управляют переменными.
@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 /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
cmd /c ipconfig /all & Output.txt
Эта команда выполняет команду и открывает файл Output.txt
в одной команде
Чтобы одновременно выполнить две команды, вы должны поместить символ a и (амперсанд) между двумя командами. Например:
color 0a & start chrome.exe
Ура!
Итак, я пытался включить конкретную задачу запуска 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"
Теперь у меня есть приятное контекстное меню для регистрации сборки.
У вас есть два варианта: Piping или просто &
:
DIR /S & START FILE.TXT
Или
tasklist | find "notepad.exe"
Трубопровод (|
) больше подходит для вывода одной команды и помещает ее в другую. И (&
) просто говорит, что запустите это, и это.
&
и |
и чем они отличаются, если вообще? Прямо сейчас люди, незнакомые с этими понятиями, не могут сами решить, какой из них следует использовать в их случаях.
Я пытаюсь иметь два пинга в одном окне, и это последовательная команда в той же строке. После завершения первого выполните вторую команду.
Решение должно было сочетаться с start /b
в командной строке Windows 7.
Начать, как обычно, без /b
и запустить в отдельном окне.
Команда, запускаемая в той же строке:
start /b command1 parameters & command2 parameters
В любом случае, если вы хотите проанализировать вывод, я не рекомендую его использовать. Я заметил, что выходной сигнал скремблируется между выходом команд.
Нет, cd / && tree && echo %time%
. Время, на которое выполняется эхо-сигнал, находится при первой команде.
У трубопровода есть некоторые проблемы, но это не критично, если люди знают, как это работает.
Когда вы пытаетесь использовать или манипулировать переменными в одной строке, остерегайтесь их содержимого! Например. переменная, подобная следующей
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
может привести к большому количеству неприятностей, если вы используете его как %PATH%
%PATH%
для обработки задачи круглых скобок%USERPROFILE%
?Это просто: просто различать их с && знаки. Пример:
echo Hello World && echo GoodBye World
Goodbye World будет напечатан после Hello World.
&&
является условным оператором, следующая команда выполняется только тогда, когда первая команда выполнена успешно (errorlevel = 0)
Еще один пример: например, когда мы используем систему сборки gulp
вместо
gulp
- default > build
gulp build
- построить сборку
gulp watch
- начать просмотр файлов
gulp dist
- создать папку dist
Мы можем сделать это с одной строкой:
cd c:\xampp\htdocs\project & gulp & gulp watch