find / v的errorlevel始终为0

时间:2015-05-22 13:51:47

标签: windows batch-file cmd find errorlevel

致电

find /V /I

只有/ V(!) ERRORLEVEL始终为0才对我而言。 (使用Win7 x64)

例如,如果我运行以下批处理文件

@echo off
SETLOCAL enabledelayedexpansion
find /V /I "camstart" testtest.txt
echo Errorlevel is !ERRORLEVEL!

在这个testtest.txt文件

intrinsicParamStatus(2338763)
calibrationFormatID(260)
calibrationFormatID(260)
leftCamStartX(88)
leftCamStartY(170)
rightCamStartX(88)

输出是:

---------- TESTTEST.TXT
intrinsicParamStatus(2338763)
calibrationFormatID(260)
calibrationFormatID(260)
Errorlevel is 0

如果我跑

@echo off
SETLOCAL enabledelayedexpansion
find /V /I "camstarRt" testtest.txt
echo Errorlevel is !ERRORLEVEL!

输出

intrinsicParamStatus(2338763)
calibrationFormatID(260)
calibrationFormatID(260)
leftCamStartX(88)
leftCamStartY(170)
rightCamStartX(88)
Errorlevel is 0

显然输出匹配任务以找到字符串“camStarRt”,它不存在,因此它输出所有行。但是为什么不改变错误级别?

完全相同时
@echo off
SETLOCAL enabledelayedexpansion
find /I "camstarrt" testtest.txt
echo Errorlevel is !ERRORLEVEL!

如预期的那样,errorlevel变为1。

这是发现中的错误吗? 我怎么能碰到这个?

我的目标是在找到python脚本输出中的某个字符串时执行任务。但如果不是这样的话,它的所有行都应该像往常一样显示,以查看脚本的工作。

python.exe C:\pycan-bin\xxx\yyy.py -m read -p lala16 -o %outfile% parameters.json | find /V /I "Response timeout"

2 个答案:

答案 0 :(得分:2)

find将过滤符合请求条件的行。

由于某些行已通过过滤器,因此没有理由提高错误级别以表示未找到匹配行,因此将其设置为0

仅当errorlevel没有回显任何内容时,

find才会被引发(设置为1),也就是说,没有任何符合请求的行。

您可以尝试使用

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "timeoutFound="
    for /f "delims=" %%a in ('
        python.exe C:\pycan-bin\xxx\yyy.py -m read -p lala16 -o %outfile% parameters.json 
    ') do (
        set "line=%%a"
        setlocal enabledelayedexpansion
        if not "!line:Response timeout=!"=="!line!" set "timeoutFound=1"
        echo(!line!
        for %%b in ("!timeoutFound!") do endlocal & set "timeoutFound=%%~b"
    )

    if defined timeoutFound (
        rem Do Something
    )

基本思想是在for /f命令中执行命令。它将遍历调用的python的输出行。在每次迭代中,for可替换参数将保存正在处理的行。

将此值分配给变量以便能够使用字符串替换,将"Response timeout"替换为空。如果删除了子字符串的变量等于变量,则不包含子字符串,否则存在子字符串并定义变量(timeoutFound)以指示它。稍后,变量定义将用于确定任务是否需要执行。

在执行之前解析一个命令块(for命令的情况)时,将删除所有变量读取操作,并在块执行之前替换为变量中的值。但是我们需要为for循环内的变量赋值,以进行子串操作。要解决这个问题,需要延迟扩展(更多here)。

答案 1 :(得分:1)

虽然find /?帮助没有具体描述这一点,但是错误级别值的标准是“如果命令成功则为0,如果失败则为1或更多”,并且在find的情况下,只有在找不到/显示一行时才会返回1。

在前两个示例中:find /V /I "camstart" testtest.txtfind /V /I "camstarRt" testtest.txt结果应该相同,因为/ I开关指示处理“camstart”和“camstaRt”以及“camStart”和“CamStart”字符串相同。

下面的代码“执行一个任务,如果找到输出中的”camstart“字符串(忽略大小写)。但如果不是,则所有行都应该像往常一样显示以查看脚本的工作。”

find /I "camstart" testtest.txt > linesFound.txt
if !errorlevel! equ 0 (
    type linesFound.txt
    execute the task here
) else (
    type testtest.txt
)