Arquivo em lote do Windows aninhado em instrução IF executando IF e THEN

1

Não tenho certeza de por que essa instrução IF aninhada não funcionará corretamente. Não consigo encontrar nenhum problema com isso. O último bloco de código realmente funciona corretamente, não tenho certeza porque o primeiro não funciona.

O primeiro script está executando o primeiro tracert, mas também imprimindo o comando ELSE da instrução IF principal também. A segunda instância deste mesmo código no meu script (idêntico, exceto por ter sCSHOSTNAME em vez de sCSCLIENTNAME) apenas imprime o comando else da instrução IF principal.

sCSCLIENTNAME is a remote server address
sCSHOSTNAME is a remote server address
dBASEHOME is the root folder where the cvping file exists
DIAGFolder is a destination folder where all of the outputs are being dumpe

A linha tracert (aquela com um monte de variáveis) funciona bem sozinha, deixando essas linhas fora para não tornar isso muito longo.

IF EXIST sCSCLIENTNAME (
   ECHO Checking network connectivity to %sCSCLIENTNAME%...
   ::cvping
   IF EXIST "%dBASEHOME%\cvping.exe" (
     "%dBASEHOME%\cvping" %sCSCLIENTNAME%> "%DIAGFolder%\cvping.txt"
   ) ELSE (
     @ECHO CVPing test skipped due to cvping not being found>> "%DIAGFolder%\cvping.txt"
   )
   ::ping
   ping %sCSCLIENTNAME%>> "%DIAGFolder%\PingResults.txt"
   :: Traceroute
   (9>"%lockFile%" tracert %sCSCLIENTNAME%>> "%DIAGFolder%\traceroute.txt") | <nul >nul 2>&1 (cmd /v /q /c "%loop% ( %wait% & %rotateSpin% & (( %check% )&&( %atEnd% )||( %progress% )))")
) ELSE (
  ECHO sCSCLIENTNAME not defined in registry, skipping tests to that value...>> "%DIAGFolder%\PingResults.txt"
  ECHO sCSCLIENTNAME not defined in registry, skipping tests to that value...>> "%DIAGFolder%\traceroute.txt"
)

Por incrível que pareça, o seguinte realmente funciona:

IF DEFINED dBASEHOME (
   ECHO\
   ECHO Checking network connectivity to %sCSHOSTNAME%...
   ::CVPING
   IF EXIST "%dBASEHOME%\cvping.exe" "%dBASEHOME%\cvping" %sCSHOSTNAME%> "%DIAGFolder%\cvping.txt"
   ::ping
   ping %sCSHOSTNAME%>> "%DIAGFolder%\PingResults.txt"
   :: Traceroute
   (9>"%lockFile%" tracert %sCSHOSTNAME%>> "%DIAGFolder%\traceroute.txt") | <nul >nul 2>&1 (cmd /v /q /c "%loop% ( %wait% & %rotateSpin% & (( %check% )&&( %atEnd% )||( %progress% )))")
   ECHO\
   ECHO Checking network connectivity to %sCSCLIENTNAME%...
   IF EXIST "%dBASEHOME%\cvping.exe" "%dBASEHOME%\cvping" %sCSCLIENTNAME%> "%DIAGFolder%\cvping.txt"
   ping %sCSCLIENTNAME%>> "%DIAGFolder%\PingResults.txt"
   (9>"%lockFile%" tracert %sCSCLIENTNAME%>> "%DIAGFolder%\traceroute.txt") | <nul >nul 2>&1 (cmd /v /q /c "%loop% ( %wait% & %rotateSpin% & (( %check% )&&( %atEnd% )||( %progress% )))")
   ECHO\
) ELSE (
   ECHO No defined servers found, skipping network connectivity tests.
   ECHO Traceroutes not run due to Application not appearing to be installed>  "%DIAGFolder%\No_Tracert.txt"
)

Eu comecei com o código inferior, então dividi-lo em 2 instruções IF, verificando sCSCLIENTNAME e sCSHOSTNAME separadamente (eu só coloquei uma das instruções IF acima, a outra é exatamente a mesma, mas variável diferente), mas também coloquei uma instrução IF na linha cvping para determinar se esse arquivo existia primeiro.

Exemplo de código autônomo ...

@ECHO OFF
cls

SET sCSCLIENTNAME=localhost
SET sCSHOSTNAME=www.google.com
SET dBASEHOME=%SystemRoot%\system32
SET DIAGFolder=%temp%\%computername%
rmdir "%DIAGFolder%" /s /q >nul 2>&1
mkdir "%DIAGFolder%" >nul 2>&1

IF EXIST sCSHOSTNAME (
   ECHO\
   ECHO Checking network connectivity to %sCSHOSTNAME%...
   ::CVPING
   IF EXIST "%dBASEHOME%\cvping.exe" (
    "%dBASEHOME%\cvping" %sCSHOSTNAME%> "%DIAGFolder%\cvping.txt"
   ) ELSE (
    @ECHO CVPing test to %sCSHOSTNAME% skipped due to cvping not being found> "%DIAGFolder%\cvping.txt"
   )
   ::ping
   ping %sCSHOSTNAME%>> "%DIAGFolder%\PingResults.txt"
   :: Traceroute
   tracert %sCSHOSTNAME%>> "%DIAGFolder%\traceroute.txt"
) ELSE (
  ECHO sCSHOSTNAME not defined in registry, skipping tests to that value...>> "%DIAGFolder%\PingResults.txt"
  ECHO sCSHOSTNAME not defined in registry, skipping tests to that value...>> "%DIAGFolder%\traceroute.txt"
)

IF EXIST sCSCLIENTNAME (
   ECHO Checking network connectivity to %sCSCLIENTNAME%...
   ::CVPING
   IF EXIST "%dBASEHOME%\cvping.exe" (
     "%dBASEHOME%\cvping" %sCSCLIENTNAME%> "%DIAGFolder%\cvping.txt"
   ) ELSE (
     @ECHO CVPing test skipped due to cvping not being found>> "%DIAGFolder%\cvping.txt"
   )
   ::ping
   ping %sCSCLIENTNAME%>> "%DIAGFolder%\PingResults.txt"
   :: Traceroute
   tracert %sCSCLIENTNAME%>> "%DIAGFolder%\traceroute.txt"
) ELSE (
  ECHO sCSCLIENTNAME not defined in registry, skipping tests to that value...>> "%DIAGFolder%\PingResults.txt"
  ECHO sCSCLIENTNAME not defined in registry, skipping tests to that value...>> "%DIAGFolder%\traceroute.txt"
)
pause
    
por BondUniverse 09.04.2015 / 23:40

0 respostas