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