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

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

dir & md folder1 & rename folder1 mainfolder

И другой случай с похожими командами, но &, замененный на &&.

dir && md folder1 && rename folder1 mainfolder

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


Еще одна вещь, которую я хочу спросить:

Однострочник batch.bat:

dir & md folder1 & rename folder1 mainfolder

Multi-liner batch.bat:

dir
md folder1
rename folder1 mainfolder

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


И еще одна вещь, которую я хотел бы знать:

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

12 голосов | спросил Quanti Monati 16 PM000000110000001931 2014, 23:48:19

1 ответ


0

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

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

ответил Mofi 17 AM00000010000003231 2014, 01:09:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132