Я предлагаю следующий код партии:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "ExeFile=nr.exe"
if "%~1" == "" goto ArgumentError
if "%~2" == "" goto ArgumentError
if not "%~3" == "" goto ProcessArguments
:ArgumentError
echo Error: %~nx0 must be called with three arguments.
exit /B 1
:ProcessArguments
rem Assign third argument to an environment variable.
set "FilePath=%~3"
rem Replace forward slashes by backslashes which is the directory separator on Windows.
set "FilePath=%FilePath:/=\%"
rem Make sure the file path ends with a backslash.
if not "%FilePath:~-1%" == "\" set "FilePath=%FilePath%\"
set "HexFile1=%FilePath%%~1"
set "HexFile2=%FilePath%%~2"
set "ExeFile=%FilePath%%ExeFile%"
if not exist "%ExeFile%" echo Error: "%ExeFile%" does not exist. & exit /B 2
if not exist "%HexFile1%" echo Error: "%HexFile1%" does not exist. & exit /B 3
if not exist "%HexFile2%" echo Error: "%HexFile2%" does not exist. & exit /B 3
"%ExeFile%" --check
"%ExeFile%" --f "%HexFile1%"
if errorlevel 1 echo Error: Processing "%HexFile1%" failed. & exit /B 4
"%ExeFile%" --f "%HexFile2%"
if errorlevel 1 echo Error: Processing "%HexFile2%" failed. & exit /B 4
echo Everything worked fine.
endlocal
Как можно скорее обнаруживается состояние ошибки, в результате которого завершается обработка пакетного файла с соответствующим сообщением об ошибке и кодом выхода.
Нет необходимости в отложенном расширении переменных среды, что ускоряет обработку пакетного файла и позволяет избежать проблем с именами каталогов или файлов, содержащих восклицательный знак.
Имя файла или путь к файлу может содержать также критические символы командной строки, такие как пробел или один из этих символов &()[]{}^=;!'+,`~
.
Нет вложенных IF условий, обеспечивающих успешное выполнение потока сверху вниз.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
call /?
... объясняет %~1
, который расширяется до аргумента 1 с удалением любых окружающих кавычек.
echo /?
endlocal /?
... используется здесь неявно при выходе из обработки пакетного файла с exit
и явно в конце пакетного файла.
exit /?
goto /?
if /?
rem /?
setlocal /?
См. Также Одна строка с несколькими командами с использованием пакетного файла Windows .