Arquivo em lote e valores de retorno de funções

-1

Eu tenho um arquivo em lotes que tem várias rotinas. exemplos

: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 é apenas um exemplo e existe. meu valor de retorno é exibido corretamente como OK. c: \ tmp2 não existe e meu returnValue é exibido corretamente como FAIL.

Espero que checkPortNumber falhe no teste, mas returnValue está definido como OK sempre. Eu tentei com setlocal enableDelayedExpansion também e não. Há algo que eu esteja perdendo?

SESHAGIRI SRIRAM
fonte

Respostas:

1

Esse código reordenado / retrabalhado / reformatado se comporta conforme o esperado.

O principal problema com o seu código é que você apenas set returnValue=OKuma vez no começo, se uma sub set returnValue=Fail- rotina persistir mesmo que outro sub faça 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 
LotPings
fonte
1
Seria uma resposta melhor se você explicasse por que isso funciona quando o código original não funciona.
DavidPostill