为什么即使找不到字符串也会出现错误级别 0?

为什么即使找不到字符串也会出现错误级别 0?

如果我运行此代码:

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

然后,如果在 File 中找不到字符串“Idle”,它将从“loop”重新开始,并继续执行,直到找到“Idle”,此时它将在代码中进一步向下移动。这一切都很好,如果我的代码结构是这样的,它将位于代码的底部而不是顶部,那么这里就没问题了,但我需要这是第一个命令(因此,如果找到 Idle,则重复此循环,如果未找到 idle,则向下移动)

但是当我运行此代码时:

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

无论是否可以找到字符串“Idle”,它总是从“loop”重新开始。

如果找到字符串,我确实需要能够运行命令(而不是如果找不到字符串,我并不打算在这里使用“goto”,我需要在找到“Idle”时运行特定的命令(如“goto”),在找不到时运行另一组命令,所以我需要两个有效的错误级别,或者另一种选择)。

为什么这不起作用?还有什么其他方法可以做到这一点?

答案1

你应该阅读一些文档。你可以从命令行输入help if或开始if /?,如果你仔细阅读,你会发现你的逻辑存在一个问题。

IF ERRORLEVEL 0表示“如果 ERRORLEVEL >=0,则返回 TRUE”。运行 FINDSTR 后,该值始终为真。

如果在 IF 之前没有 TIMEOUT,那么您可以简单地使用 IF NOT ERRORLEVEL 条件。

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

但是当您添加 TIMEOUT 命令时,逻辑会被破坏,因为它会将 ERRORLEVEL 清除为 0。因此,您必须在运行 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)

答案2

我最终找到了另一种解决方案。(仅当字符串是我的文件中的第一行时才有效)

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

这对我有用,但我仍然想知道为什么错误级别没有按宣传的那样工作,或者我只是误解了它们(正确的答案将归于解释为什么原始问题中的代码不起作用的人)

相关内容