Batch file 当文件夹为空时,For循环不会抛出errorlevel 1
我在批处理脚本中有以下行Batch file 当文件夹为空时,For循环不会抛出errorlevel 1,batch-file,for-loop,errorlevel,Batch File,For Loop,Errorlevel,我在批处理脚本中有以下行 for %%a in (*.rmt) do (findstr /C:" model='" %%a)>tmp.par 当我在一个空文件夹上运行这个时,errorlevel仍然是0 但是,如果我将*.rmt替换为文件夹中也不存在的文件名,例如x.rmt,则errorlevel变为1 理想情况下,如果文件夹中没有RMT文件,则不应设置错误级别=0 我需要这个For循环来处理*.rmt,因为一个文件夹中可能有0到多个rmt文件。请帮忙 谢谢 注意:如果一个
for %%a in (*.rmt) do (findstr /C:" model='" %%a)>tmp.par
当我在一个空文件夹上运行这个时,errorlevel仍然是0
但是,如果我将*.rmt替换为文件夹中也不存在的文件名,例如x.rmt,则errorlevel变为1
理想情况下,如果文件夹中没有RMT文件,则不应设置错误级别=0
我需要这个For循环来处理*.rmt,因为一个文件夹中可能有0到多个rmt文件。请帮忙
谢谢
注意:如果一个RMT文件中存在字符串“model=”,则该字符串将强制出现在文件夹中的所有其他RMT文件(如果有)中。尝试以下操作:
@echo off
for /F "delims=" %%i in ('dir /b "path_to_dir\*.rmt"') do (
:: echo Folder is NON empty
findstr /C:"model='" %%i >> C:\testlog.log
goto :EOF
)
否,如果没有迭代,FOR命令从不将ERRORLEVEL设置为0 是,以下命令报告ERRORLEVEL=1:
for %%a in (notExists.rmt) do (findstr /C:" model='" %%a)>tmp.par
但这是因为如果不包含通配符,simple FOR只会在IN()子句中列出字符串。检查文件是否存在并不麻烦。因此,FINDSTR命令实际上引发了错误,因为它找不到文件,而不是FOR语句
<>你的命令有缺陷,因为每个迭代都会覆盖以前的TMP.PAR。这可以通过添加额外级别的括号轻松解决。这也将创建一个空TMP.PAR,如果没有找到文件,或者如果没有文件包含搜索字符串。无法依赖ERRORLEVEL,因为如果未找到任何文件,则不会设置其值,或者根据最后一个文件是否包含搜索字符串,它可能为0或1
(for %%a in (*.rmt) do (findstr /C:" model='" %%a))>tmp.par
如果您不介意在每行输出上都有一个文件名:
前缀,那么您可以将代码简化为:
findstr /C:" model='" *.rmt >tmp.par 2>nul
<>这也将创建一个空TMP.PAR文件,如果没有找到文件,或者没有文件包含搜索字符串。但现在误差水平将是可靠的。如果未找到任何文件或没有包含搜索字符串的文件,则ERRORLEVEL为1。否则,错误级别将为0。如果与
*.rmt
不匹配,则永远不会执行findstr
,因此错误级别保持不变
当您使用x.rmt
时,FOR
会改变行为-它不再寻找文件名匹配,而是寻找特定的字符串-可能是文件名,也可能不是,也可能不存在
您可以在为
@ECHO关闭
SETLOCAL
回声y |查找“x”>nul
对于(*.rmt)do中的%%a(findstr/C:“model=”%%a)
回显errorlevel=%errorlevel%
后藤:EOF
除非找到匹配项,否则将返回
errorlevel
1。您应该添加“delims=“
”来处理名称中有空格的文件,或者添加“eol=:delims=“
”,以防止文件名以开头的意外事件代码>@dbenham:谢谢。编辑了我的答案。谢谢!!通过故意将errorlevel设置为1,简单的解决方法!只有一个问题..你能解释一下errorlevel是如何设置为1的吗?这两条线是干什么的?SETLOCAL ECHO y | FIND“x”>nulTheSETLOCAL
不相关。它只是确保在批处理结束时环境保持不变——当批处理的一次运行可能会保留变量并影响其他批处理时,这一点非常有用。ECHO
行是设置errorlevel
非零的多种方法之一。它将y
作为输入发送到find
实用程序,该实用程序正在尝试查找字符串“x
”FIND
将errorlevel
设置为0
如果找到字符串,则设置为1
。>nul
将任何输出重定向到nul
设备,只需将其关闭,屏幕上就不会显示任何内容。将ERRORLEVEL设置为1的更有效方法是(调用)
,无需空格。将ERRORLEVEL设置为0的一个好方法是使用空格(call)
。只有当所有.RMT文件都包含搜索字符串,或者它们都不包含搜索字符串时,预设ERRORLEVEL才起作用。起初,我在OP的问题中忽略了这个事实的重要性。谢谢你的简明解释!非常有帮助!