문자열을 찾을 수 없는데 왜 에러 레벨 0입니까?


1

이 코드를 실행하면 :

:loop
(type "File" | findstr Idle) > nul 2>&1
timeout 1
if errorlevel 1 goto loop

그런 다음 File에서 문자열 "Idle"을 찾을 수 없으면 "loop"에서 다시 시작하여 "Idle"이 발견 될 때까지 계속해서 코드에서 더 아래로 이동합니다. 이것은 모두 좋고 훌륭하며, 코드가 맨 위가 아닌 코드의 맨 아래에 있도록 구조화 된 경우 여기에 문제가 없지만 첫 번째 명령이 필요합니다 (유휴가 발견되면) 유휴 상태가 없으면 아래로 이동하십시오.)

그러나이 코드를 실행할 때 :

:loop
(type "File" | findstr Idle) > nul 2>&1
timeout 1
if errorlevel 0 goto loop

문자열 "유휴"를 찾을 수 있는지 여부에 관계없이 항상 "루프"에서 다시 시작됩니다.

문자열을 찾을 수없는 경우 (문자열을 찾을 수없는 경우가 아니라 (여기서 "goto"를 사용할 계획이 아니라면 "goto"와 같은) 특정 명령을 실행할 필요가있을 때) 실제로 명령을 실행할 수 있어야합니다. 유휴 "가 발견되고 명령이없는 경우 다른 명령 세트가 있으므로 두 개의 유효한 오류 레벨 또는 대안이 필요합니다.

왜 이것이 작동하지 않으며, 이것을 수행하기위한 다른 방법이 있습니까?

답변:


2

몇 가지 문서를 읽어야합니다. 입력 help if하거나 if /?명령 줄에서 시작할 수 있으며 주의 깊게 읽으면 논리에 문제가있는 것입니다.

IF ERRORLEVEL 0"ERRORLEVEL이> = 0이면 TRUE를 반환합니다"를 의미합니다. FINDSTR을 실행 한 후에는 항상 해당됩니다.

IF 이전에 시간 초과가 없으면 IF NOT ERRORLEVEL 조건을 사용할 수 있습니다.

:loop
(type "File" | findstr Idle) > nul 2>&1
if not errorlevel 1 goto loop

그러나 ERRORLEVEL을 0으로 지우므로 TIMEOUT 명령을 추가하면 로직이 삭제됩니다. 따라서 TIMEOUT을 실행하기 전에 값을 고유 변수에 저장해야합니다.

:loop
(type "File" | findstr Idle) > nul 2>&1
set err=%errorlevel%
timeout 1
if %err% == 0 goto loop

그러나 &&대신 사용 합니다.

:loop
type "File" | findstr Idle >nul 2>nul && (timeout 1 & goto :loop)

아니면 더 나은 :

:loop
findstr Idle "File" 2>nul >nul && (timeout 1 & goto :loop)

오류 수준 1이 아닌 경우 오류 수준 0과 동일한 결과를 제공합니다 (예 : 항상 통과). 실제로 이미 시도했습니다. 대체 솔루션은 +1이지만 꽤 효과적입니다.
Cestarian

@Cestarian-아니오, ERRORLEVEL> = 0이면 IF ERRORORLEVEL 0은 참이고, ERRORLEVEL <1이면 IF NOT ERRORLEVEL 1은 참입니다.
dbenham

예, 오류 수준이 다른 변수로 처리 될 수 있음을 알 수 있다면 도움말 에 대한 귀하의 의견 덕분에 실제로 오류 수준이 원하는대로 작동한다는 것을 알았습니다 (오류 수준이 0보다 크면 오류 수준 0이 true 인 경우). 그러나 "오류 레벨 1이 아닌 경우 goto 루프"가 작동하지 않는다는 사실은 변경되지 않습니다. echo를 사용하여 오류 수준이 무엇인지 알려주고 오류 수준이 1 인 경우 에도이 문을 통과하지 않습니다. 실제로 작동하는 방법을 찾으면 (오류 수준 사용)이 대답을 수락합니다.
Cestarian

젠장, 정말 이상한 행동을 보이고 있습니다, 나는 많은 것들을 시도했습니다. 예를 들어 % errorlevel % neq 1 goto 루프 이면 errorlevel이 1 인 경우에도 진행됩니다 (goto 루프에서와 같이). 그러나 내가 0을 요구하면 (오류 수준이 1이더라도) 매번 루프 아래에서 계속됩니다. 이게 너 한테 안해?
Cestarian

@Cestarian-ERRORLEVEL을 지우는 TIMEOUT 명령입니다. 내 답변을 업데이트했습니다. 또한, 당신은 stackoverflow.com/a/13476936/1012053 에서 downvote를 제거하는 것을 고려할 수 있습니다 (나는 당신이라고 가정합니다)
dbenham

0

결국 대안 솔루션을 찾았습니다. (문자열이 내 파일의 첫 번째 줄이므로 작동합니다)

:loop
set /p var=<File
timeout 1
if "%var%"=="Idle" goto loop

이것은 나를 위해 일했지만 오류 수준이 광고 된대로 작동하지 않는 이유 또는 오해가있는 경우 여전히 답을 원합니다 (원래 질문의 코드가 작동하지 않는 이유를 설명하는 사람에게는 올바른 답변이 표시됩니다)


이것은 "유휴"가 파일의 첫 번째 줄인 경우에만 작동하며 질문에 암시되지 않습니다.
dbenham

@ dbenham 네, 그렇습니다. 이것은 결코 문제가되지 않았습니다. 내 대답에서 말했듯이 이것은 내 질문에 대한 완벽한 대답이 아닙니다.
Cestarian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.