2014-09-10 99 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 
相關問題