2017-08-11 25 views

回答

1

如果你只有2或3個排除你可以做這樣的事情。

for /d %%A IN (u:\mainfolder\*) DO if /i not "%%A"=="u:\mainfolder\Name1ToExclude" if /i not "%%A"=="u:\mainfolder\Name2ToExclude" if not exist "%%A\%var1%" mkdir "%%A\subfolder" 

否則,如果你有更多的,你可能需要使用名稱的表排除。

1

命令對於不支持排除選項。

但是可以使用FOR執行的命令DIRFINDSTR要實現的任務。

@echo off 
set "MainFolder=U:\mainfolder" 
for /F "delims=" %%A in ('dir "%MainFolder%\*" /AD /B ^| %SystemRoot%\System32\findstr.exe /E /I /L /V /X /C:"Exclude Folder 1" /C:ExcludeFolder2 /C:FolderToExclude3 2^>nul') do if not exist "%MainFolder%\%%A\%var1%" mkdir "%MainFolder%\%%A\subfolder" 
set "MainFolder=" 

命令DIR被執行以因爲選項/AD(屬性目錄)與環境變量MainFolder指定的輸出只在目錄的目錄和/B(裸格式)。目錄名稱由DIR輸出,不含路徑,只是目錄名稱。

DIR輸出使用重定向符|管道作爲輸入到FINDSTR

FINDSTR搜索中的所有行與選項/C爲文本字符串指定的,因爲選項/L不括在雙引號或封閉的,因爲目錄名雙引號的一個字符串包含空格字符,或這些字符之一:&()[]{}^=;!'+,`~

由於選項/I,搜索不區分大小寫。

由於/X這意味着整個目錄名稱必須與其中一個搜索字符串完全匹配,所以只有當輸入行與搜索字符串完全匹配時,匹配纔是肯定的。

選項/V導致FINDSTR的反轉輸出。它不打印與其中一個搜索字符串匹配的行,而是打印與任何搜索字符串都不匹配的行(=目錄名稱)。

不帶路徑的已過濾目錄名將被逐行處理FOR

重定向操作符|>必須以插入符號^在最後執行的命令行轉義:

dir "U:\mainfolder\*" /AD /B | C:\Windows\System32\findstr.exe /E /I /L /V /X /C:"Exclude Folder 1" /C:ExcludeFolder2 /C:FolderToExclude3 2>nul 

此命令行是通過在一個單獨的命令處理中執行FOR在背景啓動。重定向操作符|>必須^轉義被解釋爲上執行命令FOR與行的其餘部分之前解析整個FOR由Windows命令解釋命令行文字字符。

上的目錄列表較長排除我建議目錄名稱寫入到一個純文本文件,並使用FINDSTR選項/G:而不是在命令行上,/C:指定這一切。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • dir /?
  • echo /?
  • findstr /?
  • for /?
  • set /?

閱讀也是微軟文章關於Using Command Redirection Operators

+0

謝謝你的深思熟慮的答案。這裏是我的最終結果: for/d %% A IN(u:\「folder1 \ *」)DO findstr「%%〜nA」「exclusions.txt」> nul ||如果不存在「%% A \% yy%「mkdir」%% A \%yy%「 – kudika

+0

@kudika您的解決方案正在運行,但效率有點低,因爲__FINDSTR__是單獨在每個目錄名稱上執行的,而不是僅在目錄列表上運行一次以用作過濾器。 – Mofi

相關問題