不,如果没有迭代,FOR 命令永远不会设置 ERRORLEVEL <> 0。
是的,以下命令报告 ERRORLEVEL=1:
for %%a in (notExists.rmt) do (findstr /C:" model='" %%a)>tmp.par
但这是因为简单的 FOR 只是在 IN() 子句中列出不包含通配符的字符串。它不会检查文件是否存在。因此,您的 FINDSTR 命令实际上引发了错误,因为它找不到文件,而不是 FOR 语句。
您的命令有缺陷,因为每次迭代都会覆盖以前的 tmp.par。这可以通过添加额外的括号来轻松解决。如果没有找到文件或没有文件包含搜索字符串,这也会创建一个空的 tmp.par。不能依赖 ERRORLEVEL,因为如果没有找到文件,则不会设置它的值,或者它可能是 0 或 1,具体取决于最后一个文件是否包含搜索字符串。
(for %%a in (*.rmt) do (findstr /C:" model='" %%a))>tmp.par
如果您不介意filename:
在每行输出中添加前缀,则可以将代码简化为:
findstr /C:" model='" *.rmt >tmp.par 2>nul
如果没有找到文件,或者没有文件包含搜索字符串,这也会创建一个空的 tmp.par 文件。但现在 ERRORLEVEL 将是可靠的。如果没有找到文件或没有文件包含搜索字符串,则 ERRORLEVEL 为 1。否则 ERRORLEVEL 将为 0。