Я хочу выполнить две команды в консоли 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. (По крайней мере, 4.0, согласно одному комментатору здесь.)
Есть немало других моментов, которые вы найдете, прокручивая эту страницу вниз.
Исторические данные следуют, для тех, кто может найти это образовательным.
До этого синтаксис && был только функцией замены оболочки 4DOS до того, как эта функция была добавлена в интерпретатор команд Microsoft.
В Windows 95, 98 и ME вы бы вместо этого использовали символ канала:
dir | echo foo
В MS-DOS 5.0 и более поздних версиях, в некоторых более ранних версиях интерпретатора команд для Windows и NT, (недокументированным) разделителем команд был символ 20 (Ctrl + T), который я буду обозначать здесь ^ T.
dir ^T echo foo
cmd
я полагаю, что это не плохая привычка. :)
Цитата из документации:
Использование нескольких команд и условной обработки символов
Вы можете запустить несколько команд из одной командной строки или сценария, используя условные символы обработки. При запуске нескольких команд с символами условной обработки команды справа от символа условной обработки действуют на основе результатов команды слева от символа условной обработки.
Например, вы можете выполнить команду только в случае сбоя предыдущей команды. Или вы можете запустить команду, только если предыдущая команда была успешной.
Вы можете использовать специальные символы, перечисленные в следующей таблице, для передачи нескольких команд.
& [...]
command1 & command2
Используется для разделения нескольких команд в одной командной строке. Cmd.exe запускает первую команду, а затем вторую команду.
&& [...]
command1 && command2
Используйте для запуска команды после &&, только если команда, предшествующая символу, успешна. Cmd.exe запускает первую команду, а затем запускает вторую команду, только если первая команда выполнена успешно.
|| [...]
command1 || command2
Используйте для запуска команды, следующей за || только если команда предшествует || выходит из строя. Cmd.exe запускает первую команду, а затем запускает вторую команду только в том случае, если первая команда не выполнена успешно (получает код ошибки больше нуля).
( ) [...]
(command1 & command2)
Используйте для группировки или вложения нескольких команд.
; or ,
command1 parameter1;parameter2
Используйте для разделения параметров команды.
cmd /c "echo foo & echo bar"
.
vagrant up && vagrant ssh
работал без кавычек на Windows 10.
&
- делает его асинхронным и работает одновременно. Я застрял, потому что я использовал &&
с синхронно и продолжается, только если первый удастся!
&
не делает команды асинхронными или параллельными. command1 & command2
будет работать command2
после command1
завершения Успех или неудача не command1
имеет значения.
&
является эквивалентом Bash для ;
(команды запуска) и &&
является эквивалентом Bash &&
(команды запуска только тогда, когда предыдущая не вызвала ошибку).
;
в Linux
;
означает запуск первой команды, ожидание ее завершения, а затем выполнение второй команды. &
означает выполнить первую команду, перевести ее в фоновый режим и запустить вторую команду. Таким образом, обе программы запускаются одновременно. Обратите внимание, что они не объединяют символы, они являются конечными символами первой команды; Вы можете запустить одну команду в фоновом режиме progname &
без второй команды.
Вы можете использовать & для запуска команд одна за другой. Пример: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
печатает старый значение, а не новое значение. По крайней мере, это то, что я наблюдаю на моем Windows 7.
setlocal EnableDelayedExpansion
в скрипте или cmd /v
). Например: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%
.
Ряд символов обработки может использоваться при выполнении нескольких команд в одной строке и может привести к перенаправлению обработки в некоторых случаях, изменению вывода в другом случае или просто к ошибке. Одним из важных случаев является размещение в одной строке команд, которые манипулируют переменными.
@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!%"
Итак, я пытался включить конкретную задачу запуска 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 запускает файл и показывает его результаты, затем отображается приглашение «Нажать любую клавишу для продолжения ...», а затем окно командной строки закрывается при нажатии клавиши.
PS Для других, кому это может быть интересно, вы можете использовать следующие записи файла .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"
Теперь у меня есть красивое меню, вызываемое правой кнопкой мыши, чтобы зарегистрировать сборку.
Я пытаюсь иметь два пинга в одном окне, и это последовательная команда в одной строке. После окончания первого запуска второй команды.
Решением было объединиться с start /b
командной строкой Windows 7.
Начните как обычно, без /b
, и запустите в отдельном окне.
Команда, используемая для запуска в той же строке:
start /b command1 parameters & command2 parameters
В любом случае, если вы хотите проанализировать вывод, я не рекомендую использовать это. Я заметил, что вывод зашифрован между выводами команд.
Ну, у вас есть два варианта: трубопровод или просто &
:
DIR /S & START FILE.TXT
Или,
tasklist | find "notepad.exe"
Piping ( |
) больше подходит для получения выходных данных одной команды и помещения их в другую. И ( &
) просто говорит запустить это, и это.
&
и что делает, и |
чем они отличаются, если вообще отличаются? Прямо сейчас люди, не знакомые с этими понятиями, не могут сами решить, какой из них следует использовать в их случаях.
Нет, cd / && tree && echo %time%
. Время отголоска - это время, когда выполняется первая команда.
У трубопровода есть некоторая проблема, но это не критично, пока люди знают, как это работает.
Еще один пример: например, когда мы используем систему gulp
сборки, а не
gulp
- по умолчанию> сборка
gulp build
- build build-folder
gulp watch
- начать просмотр файла
gulp dist
- построить dist-folder
Мы можем сделать это одной строкой:
cd c:\xampp\htdocs\project & gulp & gulp watch
Когда вы пытаетесь использовать или манипулировать переменными в одной строке, остерегайтесь их содержимого! Например, переменная, подобная следующей
PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
может привести к множеству непредвиденных проблем, если вы используете его как %PATH%
%PATH%
для решения проблемы скобок%USERPROFILE%
содержать ссылочная переменная, такая как ?Используйте &
символ в Windows, чтобы использовать команду в одной строке
C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook
как в Linux мы используем,
touch thisfile ; ls -lstrh
Да, есть. Это &
.
&&
выполнит команду 2, когда команда 1 будет выполнена, при условии, что она не завершилась неудачей.
&
будет выполнять независимо.
Все просто: просто различайте их по &&
знакам. Пример:
echo "Hello World" && echo "GoodBye World".
«Goodbye World» будет напечатан после «Hello World».
&&
является условным оператором, следующая команда выполняется только тогда, когда первая команда выполнена успешно (errorlevel = 0)
Hello World
не провалилась. как сказал @jeb, &&
условно. &
запускает команды независимо от того, был ли предыдущий успешным или нет.