IF 및 THEN을 모두 실행하는 Windows 배치 파일 중첩 IF 문


1

이 중첩 된 IF 문이 올바르게 작동하지 않는 이유를 잘 모릅니다. 나는 그것으로 어떤 문제를 찾을 수 없습니다. 마지막 코드 블록은 실제로 제대로 작동하지만 첫 번째 코드 블록이 그렇지 않은 이유는 확실하지 않습니다.

첫 번째 스크립트는 첫 번째 tracert를 실행하지만 주 IF 문의 ELSE 명령도 인쇄합니다. 스크립트에서 동일한 코드의 두 번째 인스턴스 (sCSCLIENTNAME 대신 sCSHOSTNAME을 제외하고 동일 함)는 주 IF 문의 else 명령을 인쇄합니다.

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 문을 넣습니다. in이 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

그렇게해서는 안된다. IF DEFINED sCSCLIENTNAME (?
MC ND

"EXIST"대신 "DEFINED"를 사용하면 오류가 발생합니다. ( was unexpected at this time.
BondUniverse

원래 게시물에 자체 포함 된 코드 샘플을 추가하여 문제를 쉽게 볼 수있게했습니다.
BondUniverse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.