Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 当文件夹为空时,For循环不会抛出errorlevel 1_Batch File_For Loop_Errorlevel - Fatal编程技术网

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”>nulThe
SETLOCAL
不相关。它只是确保在批处理结束时环境保持不变——当批处理的一次运行可能会保留变量并影响其他批处理时,这一点非常有用。
ECHO
行是设置
errorlevel
非零的多种方法之一。它将
y
作为输入发送到
find
实用程序,该实用程序正在尝试查找字符串“
x
FIND
errorlevel
设置为
0
如果找到字符串,则设置为
1
>nul
将任何输出重定向到
nul
设备,只需将其关闭,屏幕上就不会显示任何内容。将ERRORLEVEL设置为1的更有效方法是
(调用)
,无需空格。将ERRORLEVEL设置为0的一个好方法是使用空格
(call)
。只有当所有.RMT文件都包含搜索字符串,或者它们都不包含搜索字符串时,预设ERRORLEVEL才起作用。起初,我在OP的问题中忽略了这个事实的重要性。谢谢你的简明解释!非常有帮助!