我使用的是 Windows 10。
我在基本目錄(此處為“d:\dir”)的不同子目錄中有許多相同名稱的資料夾(假設名稱為“data”)。
如何刪除所有名為「data」的資料夾的內容(僅包含檔案)而不刪除自身?
例如對於三個資料夾:
d:\目錄\數據 d:\dir\tmp1\data d:\dir\tmp3\tmp2\data
答案1
在 Windows 命令提示字元視窗中,可以使用下列命令列僅刪除所有目錄及其子目錄中data
的所有檔案(不是資料夾):D:\dir
for /F "delims=" %I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| findstr /E /I /C:"\data"') do @del /A /F /Q "%I\*"
相同的命令列將在 Windows 批次檔中編寫如下:
@echo off
for /F "delims=" %%I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /C:"\data"') do del /A /F /Q "%%I\*"
命令為了%ComSpec% /C
在後台命令列啟動的單獨命令進程中執行:
dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"
環境變數ComSpec
通常被定義為%SystemRoot%\System32\cmd.exe
在查看時可以看到的那樣系統Windows 中的環境變數控制面板-系統-進階系統設定-環境變數...。預設情況下,環境變數SystemRoot
是使用 Windows 目錄的路徑定義的。換句話說為了預設情況下,在大多數 Windows PC 上執行,並使用和之間指定的C:\Windows\System32.exe
選項/C
和命令列。另請參閱維基百科文章,其中包含預先定義的列表('
')
Windows環境變數。
命令目錄要處理的輸出標準輸出(標準輸出)
- 由於選項的原因,為裸格式
/B
- 由於選項
/AD
(屬性目錄)而只是目錄名稱 - 由於選項的完整路徑
/S
- 匹配通配符模式
*data
- 在指定目錄下
D:\dir
- 及其所有子目錄也因為選項
/S
。
目錄會輸出一條錯誤訊息來處理標準錯誤錯誤率(標準錯誤)沒有與這些條件相符的目錄條目。透過將其重定向到設備可以抑制此錯誤訊息零點和2>nul
。
所以輸出為目錄對於給定的例子:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
的輸出目錄處理標準輸出被重定向|
到處理標準輸入下一個命令的(標準輸入)查找字串。
查找字串流中的搜尋讀取自標準輸入逐行
- 由於選項不區分大小寫
/I
- 按字面解釋的字串
\data
- 由於 option ,必須在行尾找到它
/E
。
所以查找字串要處理的輸出標準輸出後台指令處理\data
行尾的所有行,這又是給定的範例:
D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data
過濾命令的輸出目錄和查找字串有必要排除一個名稱類似的目錄,MyData
該目錄也由目錄因為通配符*
需要不輸出D:\dir\data
及其子目錄的所有子目錄,而是輸出及其子目錄的所有data
目錄。D:\dir
閱讀 Microsoft 文章:使用命令重定向運算符2>nul
和的解釋|
。重定向運算子>
和|
必須使用插入符號進行^
轉義為了當 Windows 命令解釋器在執行命令之前處理此命令列時,命令列將被解釋為文字字符為了dir
它在背景啟動的單獨命令進程中執行嵌入式命令列。
為了with 選項/F
可擷取最終要處理的所有輸出標準輸出啟動的命令進程,並在啟動的終止後逐行處理此輸出cmd.exe
。
空行總是被忽略為了,但沒有輸出空白行目錄和查找字串。
為了預設也忽略所有以 a 開頭的行,;
這是預設的行結束符。但捕獲的所有行為了在這種情況下,永遠不要以分號開頭,因為所有行都以D:
.所以保持預設eol=;
即可。否則eol=|
通常是處理檔案/資料夾名稱清單的最佳選擇,因為檔案/資料夾名稱不能包含垂直線。
為了預設情況下,將使用普通空格和水平製表符作為字串分隔符號將每一行拆分為子字串,並將僅將第一個空格/製表符分隔的字串分配給指定的循環變量I
。目錄路徑中的資料夾名稱data
可以包含空格字元。因此,指定了一個空的分隔符號列表,delims=
該列表會停用行分割行為,從而導致I
始終將找到的資料夾的完整限定名稱指派給循環變數data
。
為了data
對分配給該命令的每個目錄執行I
:
del /A /F /Q "%I\*"
%I
在執行之前被替換德爾透過目前指派給循環變數的完整限定目錄名稱I
。
命令德爾用於刪除檔案。它不會刪除目錄。此選項/A
用於刪除所有與其屬性無關的文件,包括具有隱藏屬性集的文件德爾沒有選項就不會刪除/A
。該選項/F
還需要強制刪除具有唯讀屬性集的文件,如果沒有選項,該文件將不會被刪除/F
。該選項/Q
用於抑制詢問用戶是否真的所有與 匹配的文件都*
應該被刪除的查詢德爾。
完整限定目錄名稱必須用雙引號括起來,因為它可能包含空格或這些字元之一,&()[]{}^=;!'+,`~
這需要使用"
命令的參數字串,如幫助中所述指令管理系統 在最後一個幫助頁面上,該頁面在命令提示字元視窗中執行時輸出cmd /?
。
請注意德爾無法刪除使用者沒有刪除檔案的 NTFS 權限的文件,或目前由應用程式以阻止在應用程式開啟文件時刪除文件的方式開啟的文件。德爾對於由於缺少 NTFS 或文件存取權限而無法刪除的每個文件,輸出錯誤訊息。
為了了解所使用的命令及其工作原理,請打開命令提示字元窗口,執行以下命令,並仔細閱讀每個命令顯示的所有幫助頁面。
del /?
dir /?
echo /?
findstr /?
for /?
答案2
按照您的範例,您必須呼叫:
Get-ChildItem -Recurse d:\dir | Where-Object { ($_.DirectoryName) -and (Split-Path $_.DirectoryName -Leaf) -eq 'data' } | Remove-Item
答案3
遞歸枚舉名為“data”的所有資料夾,然後刪除其內容。
$base_dir = 'D:\dir'
$name = 'data'
Get-ChildItem $base_dir -Recurse -Force | Where-Object {
$_.PSIsContainer -and
$_.Name -eq $name
} | Select-Object -Expand FullName | ForEach-Object {
Remove-Item "$_\*" -Recurse -Force
}
在 PowerShell v3 及更高版本中,您可以使用帶有 的$_.PSIsContainer
參數來取代篩選條件。-Directory
Get-ChildItem