【问题标题】:findstr for filename in win7 batch filewin7批处理文件中文件名的findstr
【发布时间】:2014-09-10 15:19:43
【问题描述】:

我在以下搜索中有些挣扎。 我需要查找错误放置在错误文件夹中的文件。我有以下测试结构(实际上它是数以百计的文件夹):

C:\test2\John\John_phone.txt
C:\test2\Mary\John_address.txt
C:\test2\Mary\Mary_address.txt
C:\test2\Mary\Mary_phone.txt
C:\test2\Mary\Peter_address.txt

文件 John_address.txt 和 Peter_address.txt 放错地方在 Mary 的文件夹中。我想检查 Mary 的文件夹中是否有任何放错位置的文件,并将它们列在单独的日志文件中。因此,对于上面的示例,日志将包含两个放错位置的文件的名称(路径),决定性标识符是人名。我有这段代码:

@echo off
cls
set /p name="Specify the name: "
::forfiles /p "%CD%\%name%" /s /m *.* /c "cmd /c echo @path">>log.txt
forfiles /p "%CD%\%name%" /s /m "| findstr /i /v "\*%name%*"" /c "cmd /c echo @path">>log.txt
pause

forfiles 的注释行有效(列出文件夹中的所有文件),所以我对 findstr 有疑问:错误:找不到类型为“| findstr /i /v *Mary*”的文件。 带有 findstr 的 /v 开关应该找到所有不包含指定名称的文件,但显然我在将它用作 forfiles 的输入时做错了。 我不想使用 dir 命令,因为它列出了其他信息,我需要将输出集成到更大的日志文件中(我只需要获取放错位置的文件的路径)。

感谢任何帮助。 谢谢。

编辑:如果像这样固定正确的文件名,编写代码会更容易吗?

All_data_%NAME%_new.txt

名称前后的内容将被固定,文件名的这种格式将是唯一正确的选项,因此必须报告其他任何内容。

【问题讨论】:

    标签: batch-file pipeline findstr


    【解决方案1】:

    对于一个简单的解决方案

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        set "rootFolder=c:\test2"
    
        ( for /d %%z in ("%rootFolder%\*"
          ) do for %%y in ("%%~fz\*"
          ) do for /f "tokens=1 delims=_" %%a in ("%%~ny"
          ) do if /i not "%%~nxz"=="%%a" echo %%~fy
        ) > log.txt
    

    这将迭代每个文件夹下的文件,测试它们的名称是否以与文件夹名称相同的字符串开头。

    已编辑原始提议的解决方案无法按预期工作,因此已删除

    已编辑 - 由于文件名没有固定格式,文件夹名可以在任何地方,这个可以用

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        set "rootFolder=c:\test2"
    
        rem create a temporary file to hold the patterns to match against the list 
        rem of files to determine if it is correctly placed
    
        set "patterns=%temp%\%~nx0.%random%.tmp"
        > "%patterns%" (
            for /d %%a in ("%rootFolder%\*") do echo(\\%%~nxa\\[^^\\]*%%~nxa[^^\\]*
        ) 
    
        rem Get the list of files, and filter to only get those that do not match
        rem the generated patterns
    
        dir /s /b /a-d "%rootFolder%\*" ^
            | findstr /r /i /c:"%rootFolder:\=\\%\\[^\\]*\\."  ^
            | findstr /r /i /e /v /g:"%patterns%" ^
        > log.txt
    
        rem Patterns file is no longer needed
        del "%patterns%" >nul 2>nul
    

    【讨论】:

    • 嗨@mc-nd,感谢您的回答。这部分工作。上面的批处理只列出了 c:\test2\Mary\John_address.txt,但是,它没有列出 Peter_address.txt - Peter 的文件夹不在根目录中。此外,它应该可以列出完全错误命名的文件,例如 address_Mary.txt 或 Mray_address.txt。我可以使用 for /f %%i in (names_list.txt) do (... 用户无法更改文件夹名称,但他们可以上传他们想要的任何内容,从列表中获取循环的正确名称列表。我知道我应该早点指定这个。谢谢。
    • @karl,管道解决方案中有一个大错误。已移除。简单的解决方案可以毫无问题地工作。无论如何我会尝试在最初的想法下解决它。谢谢。
    • @karl,答案已更新。包括更灵活的文件/文件夹匹配。
    • 这似乎是我想要的。我将需要进行更多测试,但看起来它会死掉工作。感谢您的帮助和努力。
    【解决方案2】:

    如果比较区分大小写,这应该会有所帮助

    for /f "delims=.'_\ tokens=2,3,*" %%a in ('forfiles /s /m *.txt /c "cmd /c echo @relpath"') do if NOT "%%a"=="%%b" @echo "%%a\%%b_%%c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多