Одна строка с несколькими командами с использованием пакетного файла Windows

Я пытаюсь понять, как работают несколько команд в одной командной строке в пакетном файле.

dir & md folder1 & rename folder1 mainfolder

и другой случай с подобными командами, но & заменить &&.

dir && md folder1 && rename folder1 mainfolder

1. В чем разница между этими двумя случаями?


другое, что я хочу спросить:

шутка batch.bat:

dir & md folder1 & rename folder1 mainfolder

мульти-лайнер batch.bat:

dir
md folder1
rename folder1 mainfolder

2. Являются ли эти однострочные и многострочные одинаковыми с точки зрения процедуры пакетного файла?


и еще одна вещь я хотел бы знать:

3. Если я вызываю другие пакетные файлы из main.Бэт, они работают независимо и одновременно? Основной пакетный файл не ждет завершения процедур в других пакетных файлах? Как это сделать?

1 ответов


& между двумя командами просто результаты в исполнении обеих команд, независимо от результата первой команды. Право команды & выполняется после команды осталось & готово независимо от успеха или ошибки предыдущей команды, т. е. независимо от значения exit / return предыдущей команды.

&& приводит к условному выполнению второй команды. Вторая команда выполняется, только если первая команда была успешной, что означает выход с код возврата 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 тестирование определенного уровня ошибок в пакетных файлах.

другие полезные темы переполнения стека об errorlevel:

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

пример:

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%"

в Эхо команда всегда выполняется независимо от результата выполнения first DIR, а второй DIR выполняется, только если первая DIR сбой, как в Windows XP или папка профиля пользователя не находится на диске C: или не в папке Users на всех.

надо использовать ( и ) на выполнение Эхо только если первый 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 или ни с одной из этих двух команд из пакетного файла.