在win7批处理文件中找到filename的文件名

时间:2014-09-10 15:19:43

标签: batch-file pipeline findstr

我正在努力进行以下搜索。 我需要查找错误文件夹中错放的文件。我有以下测试结构(实际上它是hudreds文件夹):

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这应该有帮助,只要比较是区分大小写的

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