即使找不到字符串,为什么它是errorlevel 0?


1

如果我运行此代码:

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

然后,如果在文件中找不到字符串“Idle”,它将在“循环”处重新开始并继续这样做,直到找到“空闲”,此时它将在代码中进一步向下移动。这一切都很好,如果我的代码是结构化的,这将在代码的底部而不是顶部,那么事情就可以了,但我需要这是第一个命令(所以如果找到空闲,重复此循环,如果未找到空闲,则向下移动)

但是当我运行这段代码时:

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

无论是否可以找到字符串“Idle”,它总是在“循环”处重新开始。

如果找到字符串,我真的需要能够运行命令(而不是找不到字符串(我不打算在这里使用“goto”,我需要运行特定命令(如“goto”)时“找不到“空闲”,找不到另一组命令,所以我需要两个有效的错误级别,或者替代方案。

为什么这不起作用,还有其他方式让我这样做?

Answers:


2

你应该阅读一些文档。你可以先输入 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)

如果不是errorlevel 1给了我与errorlevel 0相同的结果(例如总是通过)我实际上已经尝试过了。尽管+1,你的替代解决方案效果非常好。
Cestarian

@Cestarian - 否,如果ERRORLEVEL&gt; = 0,则IF ERRORORLEVEL 0为真,而如果ERRORLEVEL <1,则IF NOT ERRORLEVEL 1为真。 1。
dbenham

是的,谢谢你的说明 如果有帮助 我能够发现errorlevel可以被视为任何其他变量,我也看到了errorlevel确实如你所说的那样运行(如果errorlevel 0为真,如果errorlevel&gt; = 0)。但这并没有改变“if not errorlevel 1 goto loop”无效的事实。我使用echo告诉我错误级别是什么,对我来说,即使errorlevel为1,它也不会通过这个语句。如果你找到一种方法确实有用(利用errorlevel),我会接受这个答案。
Cestarian

该死的男人,它表现出非常奇怪的行为,我尝试了很多东西。例如, if%errorlevel%neq 1 goto loop 即使errorlevel为1(如在goto循环中),它也会通过。但是,如果我这样做 neq 0 它每次都会在循环下面继续(即使errorlevel是1)。是不是这样对你?
Cestarian

@Cestarian - 正是TIMEOUT命令清除了ERRORLEVEL。我已经更新了我的答案。此外,您可以考虑删除您的downvote stackoverflow.com/a/13476936/1012053 (我假设那是你)
dbenham

0

我最终找到了另一种解决方案。 (仅适用,因为字符串是我文件中的第一行)

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

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


仅当“空闲”是您文件中的第一行时才有效,这不是您的问题所暗示的。
dbenham

@dbenham是的,但这确实不是问题,就像我在回答中说的那样,这不是我问题的完美答案。
Cestarian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.