1

Не уверен, почему это вложенное выражение IF не будет работать правильно. Я не могу найти никаких проблем с этим. Последний блок кода на самом деле работает правильно, не знаю, почему первый не работает.

Первый скрипт запускает первый tracert, но также распечатывает команду ELSE основного оператора IF. Второй экземпляр этого кода в моем скрипте (идентичный, за исключением того, что вместо sCSCLIENTNAME используется sCSHOSTNAME) просто выводит команду else основного оператора IF.

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

Линия tracert (та, которая содержит кучу переменных) работает в одиночку, оставляя эти строки не слишком длинными.

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"
)

Как ни странно, на самом деле работает следующее:

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"
)

Я начал с нижнего кода, затем разделил его на 2 оператора IF, проверяя sCSCLIENTNAME и sCSHOSTNAME по отдельности (я только поставил один из операторов IF выше, другой точно такой же, но другой переменной), но также поместил оператор IF в строке cvping, чтобы определить, существует ли этот файл первым.

Автономный пример кода ...

@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

0