Por que é errorlevel 0, mesmo que a string não seja encontrada?

1

Se eu executar este código:

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

Então, se a string "Idle" não puder ser encontrada dentro de File, ela será reiniciada em "loop" e continuará assim até que "Idle" seja encontrado, ponto em que irá descer mais no código. Isso tudo é bom, e se meu código foi estruturado de forma que isso estaria na parte inferior do código e não no topo, as coisas ficariam bem aqui, mas eu preciso que este seja o primeiro comando (então se Idle for encontrado , repita este loop, se o idle não for encontrado, mova para baixo)

Mas quando eu executo este código:

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

Ele sempre será reiniciado em "loop", independentemente de a string "Idle" ser ou não encontrada.

Eu realmente preciso ser capaz de executar um comando se a string for encontrada (em vez de a string não ser encontrada (não estou planejando usar "goto" aqui, preciso executar comandos específicos (como "goto" ) quando "Idle" é encontrado, e outro conjunto de comandos quando não é encontrado, então eu preciso de dois errorlevels válidos, ou uma alternativa).

Por que isso não funciona e que outra maneira existe para eu fazer isso?

    
por Cestarian 02.05.2016 / 03:08

2 respostas

2

Você deve ler alguma documentação. Você pode começar digitando help if ou if /? na linha de comando, e se você ler atentamente, verá um problema com sua lógica.

IF ERRORLEVEL 0 significa "retornar TRUE se ERRORLEVEL for > = 0". Isso sempre será verdade depois de executar o FINDSTR.

Se você não tiver TIMEOUT antes do seu IF, pode simplesmente usar a condição IF NOT ERRORLEVEL.

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

Mas a lógica é destruída quando você adiciona o comando TIMEOUT porque ele limpa o ERRORLEVEL para 0. Portanto, você deve salvar o valor em sua própria variável antes de executar o TIMEOUT.

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

Mas eu usaria && :

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

Ou melhor ainda:

:loop
findstr Idle "File" 2>nul >nul && (timeout 1 & goto :loop)
    
por 02.05.2016 / 06:59
0

Eu encontrei uma solução alternativa eventualmente. (Só funciona porque a string é a primeira linha do meu arquivo)

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

Isso funcionou para mim, mas eu ainda gostaria de uma resposta para por que errorlevels não estão funcionando como anunciado, ou se eu estou apenas entendendo mal (a resposta correta irá para quem explica porque o código na pergunta original não funciona) t trabalho)

    
por 02.05.2016 / 03:36

Tags