for /d %%A IN (u:\mainfolder\*) DO if not exist "%%A\%var1%" mkdir "%%A\subfolder"
我想排除在目錄ü特定的文件夾:\ mainfolder \,這樣的mkdir執行上除了少數有文件夾的。有沒有辦法通過使用通配符來排除某些文件夾?有沒有辦法來排除通配符一定值/變量,在for循環中
for /d %%A IN (u:\mainfolder\*) DO if not exist "%%A\%var1%" mkdir "%%A\subfolder"
我想排除在目錄ü特定的文件夾:\ mainfolder \,這樣的mkdir執行上除了少數有文件夾的。有沒有辦法通過使用通配符來排除某些文件夾?有沒有辦法來排除通配符一定值/變量,在for循環中
如果你只有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"
否則,如果你有更多的,你可能需要使用名稱的表排除。
命令對於不支持排除選項。
但是可以使用FOR執行的命令DIR和FINDSTR要實現的任務。
@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。
謝謝你的深思熟慮的答案。這裏是我的最終結果: for/d %% A IN(u:\「folder1 \ *」)DO findstr「%%〜nA」「exclusions.txt」> nul ||如果不存在「%% A \% yy%「mkdir」%% A \%yy%「 – kudika
@kudika您的解決方案正在運行,但效率有點低,因爲__FINDSTR__是單獨在每個目錄名稱上執行的,而不是僅在目錄列表上運行一次以用作過濾器。 – Mofi