关于使用批处理文件的 FIND 指令。将结果存储在变量中
Regarding FIND Instruction using Batch File. Storing result in a variable
我正在许多子文件夹下的文件列表中搜索字符串。如果找到该字符串,那么我将执行更多语句(这对我的问题来说并不重要)。
所以我所做的是使用 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
)
)
还要感谢其他回复,虽然我没有费心使用它们,但我很感激这些努力!
find
不写破折号和文件名,如果它是从管道输入的。并且不需要额外的变量(findstr1
):
for %%G in (*.*) do (
for /F "delims=" %%A in ('type %%G^|find /c "PROGRAM-ID."') do echo %%A %%G
)
正确答案是使用 EnableDelayedExpansion
感谢@npocmaka
我正在许多子文件夹下的文件列表中搜索字符串。如果找到该字符串,那么我将执行更多语句(这对我的问题来说并不重要)。
所以我所做的是使用 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
)
)
还要感谢其他回复,虽然我没有费心使用它们,但我很感激这些努力!
find
不写破折号和文件名,如果它是从管道输入的。并且不需要额外的变量(findstr1
):
for %%G in (*.*) do (
for /F "delims=" %%A in ('type %%G^|find /c "PROGRAM-ID."') do echo %%A %%G
)
正确答案是使用 EnableDelayedExpansion
感谢@npocmaka