String 用于在目录和所有子目录中查找字符串的批处理脚本

String 用于在目录和所有子目录中查找字符串的批处理脚本,string,directory,root,String,Directory,Root,我想编写一个批处理文件,它使用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"

我想编写一个批处理文件,它使用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文件中。我知道这一定是语法方面的问题,但我似乎无法理解。

您的脚本中有一些错误:

  • set
    命令的等号后面不应有空格。具体来说,请删除
    set/p“var1=
    之后的空格

  • 要展开变量,必须在变量名称前后加上百分号,因此使用
    %var%
    代替
    %var%

  • 与您的问题没有直接关系,但为什么要调用两次
    find

  • 我还使用了一个临时文件,这样
    result.txt
    就不会被
    find
    搜索

    请注意,对于从文件运行批处理脚本,在使用循环变量时需要使用双百分号,例如:
    %%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
    
    刚刚找到abc*


    相比之下,findstr/v将在没有abc的情况下全部打印

    是否有任何方法可以让脚本搜索脚本文件实际所在的目录和子目录。目前,如果我以管理员身份运行此操作,它只会在system32文件夹中查找文件,但我将脚本放在外部硬盘上的文件夹中,并希望在那里搜索。I类似这样的设置路径名=“U:\some\U文件夹”“cd/d%Pathname%,但它似乎被卡住了,没有写入任何内容。实际上,在第一行之后插入一行
    pushd%~p0
    ,并在脚本的最后插入一行
    popd
    。”。它将当前目录更改为
    %~p0
    ,扩展到脚本所在的目录,然后在脚本完成后更改回上一个目录。啊,我看到了查找所有工作,但它仍然打印目录中每个文本文件的路径,即使.txt不包含字符串。如果查找成功,有没有办法让它只写入result.txt?我相信有更好的解决方案可以避免双重调用
    find
    。。。不管怎样,我很高兴你发现它很有用。