使用findstr查找多个字符串并将文件复制到文件夹的批处理文件

3

我试图在一个目录中查找多个字符串,这个目录中有成千上万个文件。我目前使用以下命令搜索该目录:

findstr /s "customerid" *

现在我可以通过这个方法找到包含该字符串的文件。通常我有两个信息,一个是客户ID,另一个是事件类型。一个客户可能有多达30个相关事件,例如“网站注册”。
我想做的是,在目录中搜索客户ID和事件,然后将文件复制到新位置。在批处理文件中是否可能实现这一点?

这有点太混乱了,我只知道一些简单的命令 :( - anallyexcel
所以你试图做一种AND操作,只有包含两个搜索字符串的文件才会被复制,是吗?搜索字符串(客户、事件)在文件中的位置是否重要?分享一个显示匹配项的文本文件摘录也将非常有帮助。它们可以出现在文本的任何位置,还是必须是完整单词? - aschipfl
Findstr "dog cat" etc 可以找到 dog 或者 cat。只要你的字符串不包含空格,这很简单。Findstr 可以做更多的事情,但语法比上面的复杂。你需要明确指定术语,例如允许使用哪些字符,它们需要按什么顺序排列。 - user6017774
Findstr /I "dog" *.txt | Findstr /I "cat" 可以找到两者。 - user6017774
2个回答

3

假设你想要查找所有同时包含以下两个词(本例中为customerevent)的文件,你可以使用以下脚本:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "PATTERN=*.txt"
set "SOURCE=."
set "TARGET=D:\Data"
set "STRING1=customer"
set "STRING2=event"

pushd "%SOURCE%" && (
    for /F "delims=" %%F in ('findstr /S /M /I /R /C:"\<%STRING1%\>" "%PATTERN%"') do (
        for /F "delims=" %%E in ('findstr /M /I /R /C:"\<%STRING2%\>" "%%F"') do (
            ECHO copy "%%E" "%TARGET%\%%~nxE"
        )
    )
    popd
)

endlocal
exit /B

测试脚本后,请删除 copy 命令前面的大写字母 ECHO

2
@echo off
    setlocal enableextensions disabledelayedexpansion

    set "sourceFolder=x:\somewhere"
    set "targetFolder=y:\another\place"

    set "customerID=00000000"
    set "event=eeeeeeeeee"

    for /f "delims=" %%a in ('
        findstr /m /s /l /c:"%customerID%" "%sourceFolder%\*" 
        ^| findstr /f:/ /m /l /c:"%event%"
    ') do (
        ECHO copy "%%~fa" "%targetFolder%"
    )
findstr可以处理它。我们只需要两个实例:
  1. 第一个实例将在所有输入文件中搜索第一个字符串,仅返回匹配文件列表。这个文件列表将被传递到第二个实例。
  2. 第二个实例将在第一个实例找到的文件中搜索第二个字符串,从标准输入流(/f:/)读取要搜索的文件列表。
其余代码只是用for /f包装了这两个findstr命令,以处理第二个命令的输出并执行文件复制。 在测试脚本后,请删除copy命令前面的大写ECHO

啊,我完全忘记了/F选项...这似乎是唯一的方法来仅使用单个for /F循环...+1! - aschipfl
1
@aschipfl,有时候我看不到我的脑海之外的世界,忘记包含显而易见的(在我的脑海中)*...移除 echo ...*。谢谢。 - MC ND

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