关于使用批处理文件的FIND指令。将结果存储在变量中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于使用批处理文件的FIND指令。将结果存储在变量中相关的知识,希望对你有一定的参考价值。

我在许多子文件夹下的文件列表中搜索字符串。如果找到了字符串,那么我将执行更多的语句(这在我的问题上并不重要)。

所以我所做的是使用FIND指令,使用/ c选项。然后存储FIND修剪最右边最后一个字符的结果(这是字符串在文件中出现的次数)。请参阅下面的示例代码...

for /F "delims=" %%A in ('find /c "PROGRAM-ID." "C:FORTESTCBL001.cbl"') do SET findstr=%%A
SET findstr=%findstr:~-1%
echo %findstr%

上面的代码给了我

1

这是正确的,因为单词“PROGRAM-ID”仅在CBL001.cbl中出现过一次。

现在,如果我在for循环上实现此代码以检查文件夹中的所有文件...

for /r "C:FORTEST" %%G in (*.*) do (
    for /F "delims=" %%A in ('find /c "PROGRAM-ID." %%G') do SET findstr1=%%A
    SET findstr1=%findstr1:~-1%        
    echo %findstr1%
)

回声正在回归

ECHO is off.

我不明白如何将for循环插入另一个for循环会弄乱代码....

谢谢阅读。

=======

编辑:问题解决了。感谢@npocmaka

所以最初,在所有关于将FIND结果存储到变量中的惨败之前,我使用ERRORLEVEL来确定FIND指令是否找到了字符串(听起来更简单),但是ERRORLEVEL没有返回正确的值,即使字符串是未找到。因此,我目前的解决方案是存储FIND的结果并使用该数据进行比较。

但似乎DelayedExpansion是导致ERRORLEVEL无法产生正确值的原始罪魁祸首。

请参阅下面的最终代码。

for /r "C:FORTEST" %%G in (*.*) do (
    find "PROGRAM-ID." %%G
    if !ERRORLEVEL! EQU 0 (
        echo ITS A COBOL
        ::do something
    ) else (
        echo NOPE NOT A COBOL
    )
)

还要感谢其他回复,我不打算使用它们,但我很感激努力!

答案

find不会写破折号和文件名,如果它从管道输入它。并且不需要额外的变量(findstr1):

for %%G in (*.*) do (
    for /F "delims=" %%A in ('type %%G^|find /c "PROGRAM-ID."') do echo %%A %%G
)
另一答案

正确的答案是使用EnableDelayedExpansion

感谢@npocmaka

以上是关于关于使用批处理文件的FIND指令。将结果存储在变量中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 bash 脚本中处理 find 的结果?

Linux下find指令

CMake中find_path的使用

批处理 命令执行结果赋值与比较

浅谈Liunx下find time命令用法

如何将选择的结果分配给 sqlplus 变量