-1

У меня есть командный файл, который имеет несколько процедур. Примеры

:checkFileExists
if not exist %1\%2 (
echo %2 does not exist under %1
set returnValue=FAIL
exit /b 1 
) 
exit /b 0 
:checkPortNumber 
if %1 LSS 1024 (
port number should be greater than 1024 and less than 65535
set returnValue=FAIL
exit /b 1 
)
... other checks for port number
exit /b 0 
... main code.. 
set returnValue=OK
call :checkFileExists c:\tmp
echo %returnValue% 
call :checkFileExists c:\tmp2
echo %returnValue% 
call :checkPortNumber 89
echo %returnValue% 

c:\tmp - это просто пример, и он существует. мое возвращаемое значение правильно отображается как ОК. c:\tmp2 не существует, и мое returnValue правильно отображается как FAIL.

Я ожидаю, что checkPortNumber не пройдёт тест, но returnValue всегда имеет значение OK. Я попытался с setlocal enableDelayedExpansion также и нет. Есть что-то, чего мне не хватает?

1 ответ1

1

Этот переупорядоченный / переработанный / переформатированный код ведет себя как ожидалось.

Основная проблема с вашим кодом заключается в том, что вы set returnValue=OK только один раз в начале, если подпрограмма set returnValue=Fail это сохраняется, даже если другая подпрограмма завершается exit /B 0 .

:: Q:\Test\2018\12\15\SU_1383774.cmd
@echo off
:: ... main code.. 

call :checkFileExists c:\tmp || Echo returned errorlevel %errorlevel%
echo %returnValue% 

call :checkFileExists c:\tmp2 || Echo returned errorlevel %errorlevel%
echo %returnValue% 

call :checkPortNumber 89 || Echo returned errorlevel %errorlevel%
echo %returnValue% 

Goto :Eof

:checkFileExists
if not exist "%~1\%~2" (
    echo %2 does not exist under %1
    set returnValue=FAIL
    exit /b 1 
) 
set returnValue=OK
exit /b 0 

:checkPortNumber 
if %1 LSS 1024 (
    echo port number should be greater than 1024 and less than 65535
    set returnValue=FAIL
    exit /b 1 
)
:: ... other checks for port number
set returnValue=OK
exit /b 0 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .