2014-09-10 62 views
2

我很苦恼下面的搜索。 我需要查找错误文件夹中错误放置的文件。我有以下的测试结构(在现实中,它是文件夹的hudreds):findstr在win7批处理文件中的文件名

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的文件夹是否有任何错位的文件,并将它们列在单独的日志文件中。因此,对于上面的例子,日志将包含两个错位文件的名称(路径),决定标识符是该人的名字。我有这样一段代码:

@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 *玛丽*“找不到。 带有findstr的/ v开关应该找到所有不包含指定名称的文件,但显然我在将它用作forfiles的输入时出错。 我不想使用dir命令,因为它列出了额外的信息,我需要将输出集成到较大的日志文件中(我只需要获取错位文件的路径)。

任何帮助表示赞赏。 谢谢。

编辑:如果正确的文件名将被修复,编写代码会更容易吗?

All_data_%NAME%_new.txt 

的东西之前和之后的名称将是固定的,文件名的格式将是唯一正确的选项,所以别的就纷纷予以报道。

回答

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 
+0

嗨@ mc-nd,谢谢你的回答。这部分工作。以上批次仅列出c:\ test2 \ Mary \ John_address.txt,但它并未列出Peter_address.txt - Peter的文件夹不在根目录中。此外,它应该工作列表文件,完全不正确的名称像address_Mary.txt或Mray_address.txt。我可以使用(names_list.txt)中的for/f %% i来获取列表中循环的正确名称列表(...用户无法更改文件夹名称,但可以上传他们想要的任何内容。我看到我应该早些指明这一点。谢谢。 – karl 2014-09-10 16:46:17

+0

@karl,管道解决方案中出现了一个BIG错误,删除了这个简单的解决方案,可以毫无问题地工作,无论如何,我会尽力在最初的想法下解决它,谢谢。 – 2014-09-10 17:03:29

+0

@karl,答案已更新。包含一个更灵活的文件/文件夹匹配。 – 2014-09-10 19:54:30

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 
相关问题