批处理脚本:在目录及其子目录中查找字符串

3
我希望编写一个批处理文件,使用find命令在父目录和所有子目录中查找字符串,并将输出打印到文本文件中,在完成后打开文本文件。我目前的代码如下:
@echo off
set /p "var1= Enter the String to Find: "
for /F "delims=" %a in ('dir /B /S *.txt') do @(find /i "%var1" "%a" 1>nul 2>&1 && find /i "%var1" "%a") >> result.txt
start result.txt

但是目前这段代码并没有将任何内容写入result.txt文件中,尽管我确定在搜索的位置中该字符串出现在多个.txt文件中。我知道肯定是语法问题,但是我似乎无法弄清楚其中的问题。

2个回答

3

您的脚本中有一些错误:

  1. set 命令后等号后面不应该有空格,具体地,在 set /p "var1= 后面删除空格。

  2. 要展开变量,必须在变量名称之前和之后加上百分号,所以请使用 %var% 而不是 %var

  3. 这与您的问题没有直接关系,但是为什么会两次调用 find

我还使用了一个临时文件,以便 find 不会搜索 result.txt

请注意,如果您从 文件 运行批处理脚本,则使用循环变量时需要使用双百分号,例如:%%a

无论如何,以下是修复后的脚本,希望能达到您想要的效果:

@echo off
set RESULT_FILE="result.txt"
set /p "var1=Enter the String to Find: "

pushd %~p0
type NUL > %RESULT_FILE%.tmp
for /f "delims=" %%a in ('dir /B /S *.txt') do (
    for /f "tokens=3 delims=:" %%c in ('find /i /c "%var1%" "%%a"') do (
        for /f "tokens=*" %%f in ('find /i "%var1%" "%%a"') do if %%c neq 0 echo %%f
    )
) >> "%RESULT_FILE%".tmp
move %RESULT_FILE%.tmp %RESULT_FILE% >nul 2>&1

:: Open the file
"%RESULT_FILE%"
popd

有没有办法让脚本搜索脚本文件所在的目录及其子目录?目前,如果我以管理员身份运行脚本,它只能在system32文件夹中找到文件,但我将脚本放在外部硬盘的一个文件夹中,并希望在那里进行搜索。 - user1818764
我尝试了类似这样的代码: set Pathname="U:\some_folder" cd /d %Pathname% 但它似乎卡住了,没有任何输出。 - user1818764
实际上,你在第一行后面插入pushd %~p0这行,然后在脚本最后插入popd这行。它会将当前目录更改为%~p0,这个变量会扩展为脚本所在的目录,并且在脚本结束时会切换回之前的目录。 - Eitan T
啊,我明白了,所有的查找都有效,但它仍然会打印目录中每个文本文件的路径,即使该.txt文件不包含该字符串。有没有办法只在查找成功时将其写入result.txt? - user1818764
我相信有更好的解决方案可以避免双重调用“find”...无论如何,我很高兴你发现它有用。 - Eitan T

0

只需使用 findstr abc * 命令即可。

相反,findstr /v 将打印出所有不包含 abc 的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接