Я хочу выполнить две команды в консоли Windows CMD.
В Linux я бы сделал это так
touch thisfile ; ls -lstrh
Как это делается в Windows?
Вот так на всех ОС Microsoft с 2000 года и до сих пор хорош:
dir & echo foo
Если вы хотите, чтобы вторая команда выполнялась только в случае успешного завершения первой команды:
dir && echo foo
Синтаксис с одним амперсандом (&) для выполнения нескольких команд в одной строке восходит к Windows XP, Windows 2000 и некоторым более ранним версиям NT. (По крайней мере, 4.0, согласно одному комментатору здесь.)
Есть немало других моментов, которые вы найдете, прокручивая эту страницу.
Исторические данные следует, для тех, кто может найти его образовательным.
До этого синтаксис && был только функцией замены Shell 4DOS до того, как эта функция была добавлена в интерпретатор команд Microsoft.
В Windows 95, 98 и ME вы бы вместо этого использовали символ канала:
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 означает сохранить,/c закроет окно):
cmd /k echo hello && cd c:\ && cd Windows
Вы можете использовать call , чтобы преодолеть проблему оценки переменных среды слишком рано - например,.
set A=Hello & call echo %A%
Ряд символов обработки может использоваться при выполнении нескольких команд в одной строке, и в некоторых случаях может привести к перенаправлению обработки, изменению вывода в другом случае или просто к ошибке. Одним из важных случаев является размещение на одной строке команд, которые манипулируют переменными.
@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
Итак, я пытался включить конкретную задачу запуска RegAsm
(зарегистрировать сборку) из контекстного меню. Проблема, с которой я столкнулся, заключалась в том, что результат вспыхнет и исчезнет, прежде чем я смог его прочитать. Поэтому я попытался передать по трубопроводу в Pause
, который не работает при сбое команды (как упоминалось здесь команда Pause не работает в сценарии .bat а здесь команда пакетного файла PAUSE не работает ). Поэтому я попробовал cmd /k
, но это оставляет окно открытым для большего количества команд (я просто хочу прочитать результат). Поэтому я добавил pause
, а затем exit
в цепочку, что привело к следующему:
cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit
Это работает как чудо - RegAsm запускает файл и показывает его результаты, затем отображается приглашение «Нажмите любую клавишу для продолжения ...», затем окно командной строки закрывается при нажатии клавиши.
Постскриптум Для других, кто может быть заинтересован, вы можете использовать следующие записи файла .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"
Теперь у меня есть красивое контекстное меню для регистрации сборки.
cmd /c ipconfig /all & Output.txt
Эта команда выполняет команду и открывает файл Output.txt
в одной команде
Чтобы выполнить две команды одновременно, вы должны поместить символ & (амперсанд) между двумя командами. Вот так:
color 0a & start chrome.exe
Ура!
Я пытаюсь иметь два пинга в одном окне, и это последовательная команда в одной строке. После окончания первого запуска второй команды.
Решением было объединить с start /b
в командной строке Windows 7.
Начните как обычно, без /b
и запустите в отдельном окне.
Команда, используемая для запуска в той же строке:
start /b command1 parameters & command2 parameters
В любом случае, если вы хотите проанализировать вывод, я не рекомендую использовать это ... Я заметил, что вывод закодирован между выводами команд.
Ну, у вас есть два варианта: трубопровод или просто &
:
DIR /S & START FILE.TXT
Или же,
tasklist | find "notepad.exe"
Трубопровод (|
) больше подходит для получения выходных данных одной команды и помещения их в другую. И (&
) просто говорит запустить это, и это.
Нет, cd / && tree && echo %time%
. Время отголоска - это время, когда выполняется первая команда.
У трубопровода есть некоторая проблема, но это не критично, пока люди знают, как это работает.
Когда вы пытаетесь использовать или манипулировать переменными в одной строке, остерегайтесь их содержимого! Например. переменная, подобная следующей
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
может привести к множеству необратимых проблем, если вы используете его как %PATH%
%PATH%
для решения проблемы с круглыми скобками%USERPROFILE%
?Еще один пример: например, когда мы используем систему сборки gulp
вместо
gulp
- по умолчанию> build
gulp build
- build build-folder
gulp watch
- запустить просмотр файла
gulp dist
- построить dist-folder
Мы можем сделать это одной строкой:
cd c:\xampp\htdocs\project & gulp & gulp watch
Да, есть. Это &.
&& выполнит команду 2, когда команда 1 будет выполнена, при условии, что она не завершилась.
& будет выполняться независимо.
Это просто: просто дифференцируйте их с помощью символов &&. Пример:
echo Hello World && echo GoodBye World
Goodbye World будет напечатан после Hello World.