致电
时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"
答案 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.txt
和find /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
)