Одна строка с несколькими командами, использующими пакетный файл 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 " Тестирование на определенный уровень ошибок в пакетных файлах".

Другие полезные темы переполнения стека об уровне ошибки:

Необходимо соблюдать осторожность при смешивании безусловного оператора & с условными операторами, такими как && а также || из-за порядка выполнения не обязательно порядок команд в командной строке.

Пример:

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 

Которые также имеют некоторые функции, такие как откат, тайм-аут и ожидание.

Другие вопросы по тегам