Почему мой блок операторов if не отображается в пакетном режиме? - PullRequest
0 голосов
/ 25 июня 2018

У меня проблема с моим следующим пакетным сценарием, где я вижу, как никогда не происходит выполнение команды %nr% --f !path2!, и я не понимаю причину.

Что я делаю не так? Слишком много вложенных условий?

РЕДАКТИРОВАТЬ: добавление НЕПРАВИЛЬНЫЙ код, где включены комментарии

rem The call to this batch script will be this
rem C:/Projects/DevelopmentTools/SDKs/TP/B/Scrpt/Exg_Serial_Flasher.bat EF.hex DH.hex C:/Projects/DevelopmentTools/SDKs/TP/B/E/Output/CN/Exe/

setlocal enabledelayedexpansion

set nr=nr.exe

if "%1"=="" (
    if "%2"=="" (
        if "%3"=="" (
            echo "[Error]"
            set "runScript="
            )
    )
) else (

    set "input1=%1"
    set "input2=%2"
    set "path3=%3%nr%"
    set "myPath"=%3"
    set "path1=!myPath!!input1!"
    set "path2=!myPath!!input2!"

    rem Control variable 
    set "runScript=true"
)

if defined runScript (

    if exist "%path3%" (

        %nr% --check

        if exist !path1! (

            %nr% --f !input1!

            echo !ERRORLEVEL!
            if !ERRORLEVEL! EQU 0 (

                echo !input1! set correctly
                if exist !path2! (

                    echo Setting !exgSerial!
                    %nr% --f !input2! 

                    if !ERRORLEVEL! EQU 0 (
                        echo Everything went fine
                    )

                ) 

            ) 

        )

    )
)

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Я предлагаю следующий код партии:

@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 .

0 голосов
/ 25 июня 2018

Я думаю, что нашел проблему, это связано с тем, что «отголоски» для отладки, похоже, влияют на выполнение скрипта. Так что в коде моего вопроса, если я включу echos, скрипт не будет работать, тогда как если я отключу их (закомментировано как показано ниже), скрипт будет работать.

Тем не менее, я не понимаю, почему это терпит неудачу с эхом в первой инстанции.

Код с отключенным эхом и работает

rem The call to this batch script will be this
rem C:/Projects/DevelopmentTools/SDKs/TP/B/Scrpt/Exg_Serial_Flasher.bat EF.hex DH.hex C:/Projects/DevelopmentTools/SDKs/TP/B/E/Output/CN/Exe/

setlocal enabledelayedexpansion

set nr=nr.exe

if "%1"=="" (
    if "%2"=="" (
        if "%3"=="" (
            echo "[Error]"
            set "runScript="
            )
    )
) else (

    set "input1=%1"
    set "input2=%2"
    set "path3=%3%nr%"
    set "myPath"=%3"
    set "path1=!myPath!!input1!"
    set "path2=!myPath!!input2!"

    rem Control variable 
    set "runScript=true"
)

if defined runScript (

    if exist "%path3%" (

        %nr% --check

        if exist !path1! (

            %nr% --f !input1!

            rem echo !ERRORLEVEL!
            if !ERRORLEVEL! EQU 0 (

                rem echo !input1! set correctly
                if exist !path2! (

                    rem echo Setting !exgSerial!
                    %nr% --f !input2! 

                    if !ERRORLEVEL! EQU 0 (
                        echo Everything went fine
                    )

                ) 

            ) 

        )

    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...