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

时间:2012-11-12 17:08:44

标签: 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") >> result.txt
start result.txt

但是这个目前甚至没有写任何结果到result.txt,即使我确定我搜索的字符串出现在多个.txt文件中。我知道它必须是语法方面的东西,但我似乎无法弄明白。

2 个答案:

答案 0 :(得分:3)

你的剧本中有一些错误:

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

  2. 要扩展变量,您必须在变量名之前和之后加上百分号,而不是%var使用%var%

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

  4. 我还使用了临时文件,因此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
    

答案 1 :(得分:0)

just findstr abc *

相反,findstr / v将打印所有没有abc