%errorlevel%在循环命令中返回0

时间:2016-10-22 12:17:31

标签: windows batch-file cmd

好的,我已经安装了Dropbox,但它不符合我的要求,所以我用Revo Pro卸载了它。 但是,当我打开任务管理器时,仍然有与其相关的进程在我的计算机上运行,​​因此我决定制作批处理以查看并删除与其相关的所有文件。

    @echo off
    cd c:\
    :a
    set /p a=Phrase that might be realted to it 

    for /r %%d IN (*.*) DO (
        (
        findstr /i /m /c:%a% "%%d"
        if "%errorlevel%"=="0" del "%%d"
        echo %errorlevel%
        )
    )

    pause

问题是:当我使用循环运行findstr,即使在分析文件中我的变量“%a%”没有匹配时,%errorlevel%返回为0.但是当我单独使用findstr并且没有匹配%ERRORLEVEL%返回1和0表示匹配。 如果我使用它,我将删除所有我的PC文件哈哈。代码有什么问题?

3 个答案:

答案 0 :(得分:1)

在带括号的系列语句中,在遇到控制该语句序列(或%var%)的动词时,任何block都会被该变量的值替换。

这里,块是由for控制的整个语句序列。遇到%errorlevel%时,errorlevel的状态会被for替换,因此可能会0

如果您使用

    findstr /i /m /c:%a% "%%d"
    if not errorlevel 1 del "%%d"
    echo %errorlevel%

然后使用run-time的{​​{1}}值(即,当它通过循环的操作改变时),命令意味着“如果errorlevel不是(1 或者大于1 )这样做......“

errorlevel会将findstr上的errorlevel设置为0,found上设为1not found设为2(IIRC) )所以NOT(1或大于1)仅选择0。请注意,在某些深奥的情况下,file not found可能会变为负数,但在errorlevel后我认为0..2是允许的范围。

答案 1 :(得分:0)

不确定代码有什么问题,但您可以使用&&操作数。

 findstr /i /m /c:%a% "%%d" && del "%%d" echo %errorlevel%

感谢Stephan纠正这个例子。

答案 2 :(得分:0)

每当Windows命令解释程序遇到(被解释为命令块的开头时,它会将整个命令块解析为匹配)标记命令块的结尾并替换所有%variable%通过变量的当前值。

这意味着在这种情况下,在第一次执行命令 FOR 之前,从 DO 之后的(到最后)的所有内容都是已经过处理,用适当变量的当前值替换所有%variable%引用。然后执行已预处理的块(在命令 IF 上)或更多次(在命令 FOR 上)。

通过调试批处理文件可以看到此行为。要调试批处理文件,必须首先使用 REM 命令删除或注释掉@echo off,或将其更改为@echo on。然后,必须打开命令提示符窗口,并在此命令提示符窗口中执行批处理文件,方法是键入其名称,如果路径或名称包含空格字符,则用双引号括起来的完整路径。 Windows命令解释程序现在显示执行前预处理后的所有命令行和命令块,当然还有标准消息和命令输出的错误消息,或者在批处理文件中出现语法错误时由Windows命令解释器本身。

打开命令提示符窗口意味着在执行命令或批处理脚本后,将cmd.exe选项/K运行到保持窗口。双击批处理文件也会启动cmd.exe以处理批处理文件,但参数/C关闭窗口会在批处理终止后自动独立于原因 - 成功完成或发生错误。

在批处理成功完成或错误处理之前,在运行批处理文件之前打开的命令提示符窗口仍然打开,但批处理文件包含不带参数/B的命令 EXIT 。所以专家批处理代码编写测试批处理文件总是通过在命令提示符窗口中运行它们而不是双击它们。

在命令提示符窗口set /?中运行的命令 SET 输出的帮助下,在同一命令块中设置或修改并引用的变量需要延迟变量扩展。

@echo off
setlocal EnableDelayedExpansion
cd /D C:\
:a
set /P "a=Phrase that might be realted to it: "

for /r %%d in (*) do (
    %SystemRoot%\System32\findstr.exe /i /m /c:"%a%" "%%d"
    if "!errorlevel!" == "0" del "%%d" >nul
)
endlocal

但是,对于检查上一个命令的退出代码,还有if errorlevel语法,如Microsoft在支持文章Testing for a Specific Error Level in Batch Files中所解释的那样。

@echo off
setlocal EnableDelayedExpansion
cd /D C:\
:a
set /P "a=Phrase that might be realted to it: "

for /r %%d in (*) do (
    %SystemRoot%\System32\findstr.exe /i /m /c:"%a%" "%%d" >nul
    if not errorlevel 1 del "%%d" >nul
)
endlocal

if errorlevel X测试上一个命令或应用程序的退出代码在修改errorlevel变量时是否大于或等于X。通过使用if not errorlevel X,检查最后一个退出代码是否低于X,如果退出代码为0,则此处为测试。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • cd /?
  • del /?
  • echo /?
  • for /?
  • if /?
  • set /?

另见