2016-11-15 213 views
0

我目前使用的這條線在Windows批處理文件:獲得從目錄中的所有文件和所有子目錄除了一個子目錄

@ REM List all *.f in current dir and all its subdirs 
dir *.f /B /S > temp1.txt 

不幸的是,子目錄中的一個(讓我們將其命名爲pest)有一個非常大的子樹,這使得這個過程非常緩慢。由於pest子目錄對於此特定任務(它不應包含任何相關文件)實際上並不重要,因此我想將其從搜索中排除。

因此,我不想搜索當前和所有子目錄,而是搜索當前目錄和除pest以外的所有子目錄。

你能提出一個簡單的方法嗎?

+2

將'DIR'命令的結果傳遞給'FIND'命令,並使用/ V選項和'FIND'命令。 – Squashman

+1

@Squashman,這並不妨礙'dir/S'列舉目錄,這是問題的意圖,據我所知... – aschipfl

回答

1

如果pest是根立即子目錄(即當前目錄,.),你可以做到以下幾點:

rem // Enumerate immediate child files in the root, output them: 
> "temp1.txt" (for %%F in (".\*.f") do @echo %%~fF) 
rem // Enumerate immediate subdirectories of the root: 
>>"temp1.txt" (
    for /D %%D in (".\*.*") do @(
     rem // Skip the rest if current subdirectory is the one to exclude: 
     if /I not "%%~nxD"=="pest" (
      rem // Output all files found in the current subdirectory recursively: 
      pushd "%%~D" 
      for /R %%E in ("*.f") do @echo %%~E 
      popd 
     ) 
    ) 
) 

這僅返回文件,但沒有目錄;如果你想這樣被列入過,請嘗試以下代碼:

rem // Output the path to the root directory itself: 
> "temp1.txt" (for /D %%D in (".") do @echo %%~fD) 
rem // Enumerate immediate child files in the root, output them: 
>>"temp1.txt" (for %%F in (".\*.f") do @echo %%~fF) 
rem // Enumerate immediate subdirectories of the root: 
>>"temp1.txt" (
    for /D %%D in (".\*.*") do @(
     rem // Skip the rest if current subdirectory is the one to exclude: 
     if /I not "%%~nxD"=="pest" (
      rem // Output the current subdirectory: 
      echo %%~fD 
      rem // Output all files found in the current subdirectory recursively: 
      for /F "eol=| delims=" %%E in ('dir /B /S "%%~D\*.f"') do @echo %%E 
     ) 
    ) 
) 

如果pest子目錄可以在樹中的任何地方,你可以使用這種方法:

@echo off 
rem /* Call subroutine with the root directory (the current one), the file pattern 
rem and the name of the directory to exclude as arguments: */ 
> "temp1.txt" call :SUB "." "*.f" "pest" 
exit /B 

:SUB val_dir_path val_file_pattern val_dir_exclude 
rem // Output directory (optionally): 
echo %~f1 
rem // Enumerate immediate child files and output them: 
for %%F in ("%~1\%~2") do echo %%~fF 
rem // Enumerate immediate subdirectories: 
for /D %%D in ("%~1\*.*") do (
    rem // Skip the rest if current subdirectory is the one to exclude: 
    if /I not "%%~nxD"=="%~3" (
     rem /* Recursively call subroutine with the current subdirectory, the file pattern 
     rem and the name of the directory to exclude as arguments: */ 
     call :SUB "%%~D" "%~2" "%~3" 
    ) 
) 

爲了避免子目錄也要輸出,只需刪除命令行echo %~f1即可。

由於此方法具有遞歸子程序調用,因此在沒有pest子目錄的情況下,性能明顯比使用簡單的dir /S命令差。

+0

謝謝。你的第一個版本正是我所需要的。 –

+0

不客氣!請考慮通過點擊綠色複選標記**接受**答案。閱讀以下幫助主題以瞭解這意味着什麼,以及爲什麼這很重要:[當某人回答我的問題時該怎麼辦?](http://stackoverflow.com/help/someone-answers)答案是「接受」?](http://stackoverflow.com/help/accepted-answer) – aschipfl

0

你可能使用目錄排除在設施ROBOCOPY:

@Echo Off 

(Set SrcDir=C:\Users\Parker\Documents) 
(Set SrcMsk=*.f) 
(Set ToExcl=pest) 
(Set OutPut=temp1.txt) 

>"%OutPut%" (For /F "Tokens=*" %%A In ('RoboCopy "%SrcDir%" NULL %SrcMsk%^ 
/L /S /FP /NDL /NS /NC /NJH /NJS /XD "%ToExcl%"') Do Echo=%%A) 

請根據需要四個parenthesesed線的相關變化。

+0

由於某種原因,這不僅返回* .f文件,而且僅返回所有這些文件? –

+0

道歉,在我的答案中有一個錯字_(現在修正了%ScrMsk%而不是%SrcMsk%)_。 – Compo

相關問題