Одиночная строка с несколькими командами с использованием командного файла 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.bat, они запускаются независимо и одновременно? Основной пакетный файл не ждет окончания процедур в других командных файлах? Как это сделать?

Ответ 1

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

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

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

Для ответа на третий вопрос см. мой ответ на Как вызвать пакетный файл в родительской папке текущего пакетного файла?, где я объяснил различия на запуск командного файла с командой call или с помощью start или ни с одной из этих двух команд из пакетного файла.