【问题标题】:Batch file to perform a looped search based on the line items of a text file基于文本文件的行项执行循环搜索的批处理文件
【发布时间】:2010-12-19 18:55:24
【问题描述】:

我一直在阅读这个论坛上的精彩帖子,并接近了我想做的事情,但无法弄清楚确切的代码。

我想创建一个 Windows 批处理文件来执行以下操作:

  • 对文本文件(这是关键字列表)的每个行项执行循环搜索,以定位特定目录中的文件
  • 对于这个搜索,部分匹配是可以的。
  • 每次找到文件时,将其移至预定义目录(例如 C:\temp\search_results)

谢谢。

【问题讨论】:

  • 它可以批量完成......但您可以使用移植到更灵活的 Windows(例如 AWK)的免费 unix 实用程序
  • 我在您的代码中看不到任何问题。也许你应该尝试一下。

标签: windows search for-loop batch-file


【解决方案1】:

我目前没有运行 Windows,所以我只能发布一些想法,而不是解决方案。

1) 使用for /f 迭代文件内容。

2) 使用find "%Keyword%" %SourceDir% 获取匹配文件列表。您必须从find 的输出中解析出文件名。

2a) 作为替代方案,您可以遍历源目录中的文件(嵌套for)并为每个文件调用find,丢弃其输出并使用其退出代码(%ERRORLEVEL%)来决定是否文件匹配(如果匹配则返回 0,如果不匹配则返回非零)。像这样的:

for %%F in (%SourceDir%\*) do (
    find "%Keyword%" %%F > nul
    if not errorlevel 1 (echo File %%F matches) else (echo File %%F does not match)
)

3) 使用move 移动匹配的文件。

【讨论】:

    【解决方案2】:

    有多个问题。

    FIND /i "%A%" ... 不起作用,FOR 变量的名称是 %%A
    第二个问题:使用 FIND 可以检查文件的内容而不是名称。 并且你应该使用缩进来避免过多的括号。

    你最好试试

    FOR /F "tokens=*" %%A IN (%listfile%) DO (
        FOR %%f in (%searchdir%\*) do ( 
            set "filename=%%~f"
            set replaced=!filename:%%A=!
            if !replaced! NEQ !filename! (
               echo !filename! contains '%%A'
            )
        )
    )
    

    它尝试将文件名中的 %%A 替换为 . 如果替换的不等于文件名,则文件名必须包含 %%A

    【讨论】:

    • 谢谢杰布。这对我有很大帮助。我真的很喜欢您将字符串与文件名进行比较的方式。我现在需要使用标准字符串的不同变体。例如。文件中的行项目可能是“Stephen King”,文件名的变体可能是: - Stephen King - King Stephen - Stephen_King 等。我将尝试捕捉所有变体。再次感谢。
    • 您可以将字符串“Stephen King”拆分为标记“Stephen”和“King”,并测试您的文件名中是否存在所有标记
    【解决方案3】:

    我编写了以下代码,但不确定我是否在正确的轨道上。这是我的设置: list.txt 文件内容是(我的文件名搜索关键字)--

    one
    two
    five
    ten
    six
    

    f1 文件夹包含 --

    four.txt
    one.txt
    three.txt
    

    我想将匹配的移动到 F2 文件夹,但代码简单我使用 echo 代替。

    我的代码是:

    @ECHO OFF
    SETLOCAL EnableDelayedExpansion
    
    
    SET listfile=D:\batchtest\list.txt
    SET searchdir=D:\batchtest\f1
    
    FOR /F "tokens=*" %%A IN (%listfile%) DO (
    
    FOR %%f in (%searchdir%\*) do (FIND /i "%A%" %%f
        if errorlevel 1 (
    echo Search failed) else (
    echo Search successful
    )   
    )
    )
    )
    

    它正在运行,但没有找到匹配的文件名。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2017-01-17
      相关资源
      最近更新 更多