0

我在批处理脚本中有以下行

for %%a in (*.rmt) do (findstr /C:"        model='" %%a)>tmp.par

当我在一个空文件夹上运行它时,错误级别仍然是 0。

但是,如果我将 *.rmt 替换为文件夹中也不存在的文件名 x.rmt,则错误级别变为 1。

理想情况下,如果文件夹中没有 RMT 文件,errorlevel 不应该!=0?

我需要这个 For 循环在 *.rmt 上工作,因为一个文件夹中可能有 0 到多个 RMT 文件。请帮忙。

谢谢。

注意:如果字符串“model='”存在于一个 RMT 文件中,它将强制存在于该文件夹中的所有其他 RMT 文件(如果有)中。

4

3 回答 3

0

不,如果没有迭代,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。

于 2014-03-12T12:09:12.037 回答
0

尝试这个:

@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
)
于 2014-03-12T11:05:01.187 回答
0

findstr如果 没有 匹配项,则永远不会执行,*.rmt因此errorlevel保持不变。

当您使用时x.rmtFOR会改变行为 - 它不再寻找匹配的文件名,而是查看特定的字符串 - 这可能是也可能不是文件名,可能存在也可能不存在。

你可以故意设置errorlevelfor

@ECHO OFF
SETLOCAL
ECHO y|FIND "x">nul
for %%a in (*.rmt) do (findstr /C:"        model='" %%a)
ECHO errorlevel=%errorlevel%
GOTO :EOF

errorlevel除非找到匹配项,否则将返回1。

于 2014-03-12T12:16:41.717 回答