【问题标题】:Regarding FIND Instruction using Batch File. Storing result in a variable关于使用批处理文件的 FIND 指令。将结果存储在变量中
【发布时间】:2018-04-11 09:26:34
【问题描述】:

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

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

for /F "delims=" %%A in ('find /c "PROGRAM-ID." "C:\FORTEST\CBL001.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
    )
)

也感谢其他回复,虽然我没有费心使用它们,但我感谢您的努力!

【问题讨论】:

    标签: windows batch-file cmd batch-processing


    【解决方案1】:

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

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

    【讨论】:

    • 这是一个需要注意的非常简洁的细节。谢谢!至于原来的问题,已经解决了。我已经编辑了关于细节的原始帖子。感谢您的宝贵时间!
    【解决方案2】:

    正确答案是使用EnableDelayedExpansion

    感谢@npocmaka

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 2021-07-29
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多