Как убедиться, что каждая команда успешна в пакетном скрипте - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть пакетный файл с 10 строками и 5 функциями в пакетном скрипте. Как я могу гарантировать, что все команды в командном файле являются успешными.

Другими словами, какова логика для вычисления кода возврата каждой команды в конце скрипта.

1. @ECHO OFF

 2. if not exist "%Destination%\%NAME%" md %Destination%\%NAME%

 3. if not exist "%Destination%\%NAME2%" md %Destination%\%NAME2%

 4. rmdir %Destination%\%NAME3%
 5. if not exist "%Destination%\NAME4%" md %Destination%\%NAME4%
 6. cd /d X:\test1

в вышеуказанных 5 строках, 4-я строка возвращает% ERRORLEVEL% 1, а 6-я строка возвращает то же самое. Но я не мог поставить IF% ERRORLEVEL% == 0 после каждой команды. Итак, как я могу написать сценарий, чтобы справиться с этим.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Для примера кода я предлагаю следующее:

@echo off
rem Verify the existence of all used environment variables.
for %%I in (Destination NAME NAME2 NAME3 NAME4) do (
    if not defined %%I (
        echo Error detected by %~f0:
        echo/
        echo Environment variable name %%I is not defined.
        echo/
        exit /B 4
    )
)

rem Verify the existence of all used directories by creating them
rem independent on existing already or not and next verifying if
rem the directory really exists finally.
for %%I in ("%Destination%\%NAME%" "%Destination%\%NAME2%") do (
    md %%I 2>nul
    if not exist "%%~I\" (
        echo Error detected by %~f0:
        echo/
        echo Directory %%I
        echo does not exist and could not be created.
        echo/
        exit /B 3
     )
)

rem Remove directories independent on their existence and verify
rem if the directories really do not exist anymore finally.
for %%I in ("%Destination%\%NAME3%") do (
    rd /Q /S %%I 2>nul
    if exist "%%~I\" (
        echo Error detected by %~f0:
        echo/
        echo Directory %%I
        echo still exists and could not be removed.
        echo/
        exit /B 2
     )
)

cd /D X:\test1 2>nul
if /I not "%CD%" == "X:\test1" (
    echo Error detected by %~f0:
    echo/
    echo Failed to set "X:\test1" as current directory.
    echo/
    exit /B 1
)

Этот пакетный файл обрабатывает почти все возможные ошибки, которые могут возникнуть во время выполнения этого пакетного файла. Оставшаяся проблема может быть вызвана переменной среды, содержащей одно или несколько двойных кавычек в своем значении. Решение будет использовать задержанное расширение.

Интерпретаторы сценариев оболочки Linux имеют возможность -e немедленно прекратить выполнение сценария, если какая-либо команда или приложение возвращает значение, не равное 0. Но интерпретатор команд Windows cmd.exe не имеет такой опции. Опции cmd.exe можно прочитать при запуске в окне командной строки cmd /?.

Так что необходимо использовать в командном файле:

  • if exist "..." exit /B 1 или goto :EOF
  • if not exist "..." exit /B 1 или goto :EOF
  • if errorlevel 1 exit /B 1 или goto :EOF
  • ... || exit /B 1 или ... || goto :EOF

См. Также статьи Переполнение стека:

0 голосов
/ 28 апреля 2018

Вы должны сначала сохранить ваш файл как .cmd вместо .bat для лучшей обработки ошибок. Также всегда заключайте свои пути в двойные кавычки. Тогда я предлагаю вам также проверить существование, чтобы преодолеть уровень ошибки.

If exist "%Destination%\%NAME3%" rmdir "%Destination%\%NAME3%"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...