Одна строка с несколькими командами, использующими пакетный файл Windows
Я пытаюсь понять, как работают несколько команд в одной командной строке в командном файле.
dir & md folder1 & rename folder1 mainfolder
И другой случай с подобными командами, но &
замещен &&
,
dir && md folder1 && rename folder1 mainfolder
1. В чем разница между этими двумя случаями?
Другая вещь, которую я хочу спросить:
Один лайнер batch.bat
:
dir & md folder1 & rename folder1 mainfolder
Multi-вкладыш batch.bat
:
dir
md folder1
rename folder1 mainfolder
2. Являются ли эти однострочные и многострочные одинаковыми с точки зрения процедуры пакетного файла?
И еще одна вещь, которую я хотел бы знать:
3. Если я вызываю другие командные файлы из main.bat, они запускаются независимо и одновременно? Основной пакетный файл не ждет окончания процедур в других пакетных файлах? Как это сделать?
2 ответа
&
между двумя командами просто приводит к выполнению обеих команд независимо от результата первой команды. Право командования &
выполняется после команды слева от &
Завершено независимо от успеха или ошибки предыдущей команды, т.е. независимо от значения возврата / возврата предыдущей команды.
&&
приводит к условному исполнению второй команды. Вторая команда выполняется, только если первая команда была успешной, что означает выход с кодом возврата 0.
Для альтернативного объяснения см. Условное выполнение.
dir & md folder1 & rename folder1 mainfolder
следовательно, равен
dir
md folder1
rename folder1 mainfolder
Многострочная замена для
dir && md folder1 && rename folder1 mainfolder
было бы
dir
if not errorlevel 1 (
md folder1
if not errorlevel 1 (
rename folder1 mainfolder
)
)
if not errorlevel 1
означает, что команда до не завершилась с кодом выхода больше 0. Как команды dir
а также md
никогда не завершайте работу с отрицательным значением, просто с 0 или более (как почти у всех команд и консольных приложений), а значение 0 является кодом выхода для успеха, это правильный метод для проверки успешного выполнения dir
а также md
, См. Статью поддержки Microsoft " Тестирование на определенный уровень ошибок в пакетных файлах".
Другие полезные темы переполнения стека об уровне ошибки:
- Какие внутренние команды cmd.exe сбрасывают ОШИБКУ в 0 при успешном завершении?
- Какие значения ERRORLEVEL установлены внутренними командами cmd.exe?
Необходимо соблюдать осторожность при смешивании безусловного оператора &
с условными операторами, такими как &&
а также ||
из-за порядка выполнения не обязательно порядок команд в командной строке.
Пример:
dir "C:\Users\%UserName%" /AD 2>nul || dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%"
Эта командная строка выполняется как:
dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 dir "%UserProfile%" /AD
echo User profile path: "%UserProfile%"
Команда ECHO всегда выполняется независимо от результата выполнения первого DIR, тогда как второй DIR выполняется только в случае сбоя первого DIR, как в Windows XP, или если папка профиля пользователя не находится на диске C: или не находится в папке Users
совсем.
Необходимо использовать (
а также )
при выполнении ECHO только в случае сбоя первого DIR после второго DIR независимо от результата второго DIR.
dir "C:\Users\%UserName%" /AD 2>nul || ( dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%" )
Эта командная строка выполняется как:
dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 (
dir "%UserProfile%" /AD
echo User profile path: "%UserProfile%"
)
Для ответа на третий вопрос см. Мой ответ на Как вызвать пакетный файл в родительской папке текущего пакетного файла? где я объяснил различия при запуске командного файла с командой call
или с start
или ни с одной из этих двух команд из пакетного файла.
Рассмотрим также скриптраннер
ScriptRunner.exe -appvscript demoA.cmd arg1 arg2 -appvscriptrunnerparameters -wait -timeout=30 -rollbackonerror -appvscript demoB.ps1 arg3 arg4 -appvscriptrunnerparameters -wait -timeout=30
Которые также имеют некоторые функции, такие как откат, тайм-аут и ожидание.