2014-11-04 15 views

回答

1

編輯到addapt到的意見(過濾器「有問題」的文件夾),而且,當我適應它,我知道有一個更好的解決方案(老辦法依然維持在年底)

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    rem Configure where to start searching for empty folders 
    set "root=c:\" 

    rem We will use a temp file to store the full list of folders 
    set "folderList=%temp%\%~nx0.%random%.tmp" 

    rem Retrieve the full list of folders (except the problematic ones) 
    rem and store it, sorted, inside the temporary file 
    ( dir /s /b /ad "%root%"^
     | findstr /v /l /i /b /c:"%programFiles:\=\\%" /c:"%systemRoot:\=\\%"^
     | sort /r 
    ) > "%folderList%" 

    rem Process the temporary file with the list of folders 
    rem "trying" to remove everything 
    for /f "usebackq delims=" %%a in ("%folderList%") do (
     rd /q "%%~fa" >nul 2>nul && echo "%%~fa" removed 
    ) 

    rem Remove the temporary file 
    del /q "%folderList%" >nul 2>nul 

要處理系統驅動器中的完整文件夾列表,該列表可能很大。 for /f已知的問題從正在運行的進程中檢索數據,所以,我更改了代碼以使用臨時文件。不是很好,但它可以快很多。

什麼將被存儲在臨時文件中?指定起點下的完整文件夾列表。該列表已過濾(findstr),以從列表中刪除%programFolders%%systemRoot%文件夾。下面的任何內容都將被忽略。

該列表按相反順序排列。由於子文件夾具有完整的父路徑作爲前綴,所以當對列表進行反向排序時,孩子將出現在其父母之前。如果所有的孩子都被刪除,父母變空了,它也會被刪除。

一旦生成列表,將執行for /f命令,併爲其中的每個元素執行rd命令。沒有檢查。只需rd。如果文件夾不是空的,則不能刪除,不需要檢查文件夾內容。

完成後,臨時文件被刪除。


OLD答案。代碼少,但效率和複雜性也較低。最好使用前面的代碼

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "root=%cd%" 
    for /f "delims=" %%a in ('dir /s /b /ad "%root%" ^| sort /r') do (
     dir /a /b "%%~fa" 2>nul |(set /p ".=" || echo rd /q "%%~fa") 
    ) 

for /f命令將執行遞歸dir檢索指定的出發點下的文件夾的完整列表,按相反的順序使(改變root可變你的需要),並對此列表進行排序文件夾列表可以從底部處理到根。此步驟對於確保在處理父對象之前執行刪除空子對象的操作是非常必要的,因此如果刪除父對象的所有子對象也將被刪除(如果爲空或當然)

對於找到的每個文件夾,dir命令是執行並將其輸出傳送至set /p命令。

如果dir命令生成數據(該文件夾不爲空),set /p將從管道讀取信息並且不會設置錯誤級別。

但是,如果正在處理的文件夾爲空,dir將不會生成輸出,set將無法​​檢索數據,errorlevel將被設置並且rd命令將被執行。

目錄刪除操作只是附和安慰,如果輸出是正確的,去掉echo

+0

似乎我無法正確理解這個問題,通過相反的順序排序這個列表意味着什麼?我是否也需要在「root =%mydirectory%」中指定我的目錄?對不起,我很新的批處理文件 – Giancarlo 2014-11-04 08:51:30

+0

@Giancarlo,一個遞歸的'dir'命令將返回一個父文件夾的所有後代之前。由於所有後代共享相同的父前綴,按降序對列表進行排序(「排序/ r」所做的操作)可確保列表中較深的(子)文件夾包含在父列表之前。所以,如果子刪除產生一個空的父親,父母也將被刪除。是的,您必須根據需要更改變量,例如'set「root = c:\」'('C' drive)或'set「root =%temp%」'(臨時文件夾)。但正如npocmaka在其答案中指出的那樣,請小心刪除系統驅動器中的文件夾。 – 2014-11-04 09:16:49

+0

謝謝,除了此代碼外,還可以排除「Windows」文件夾嗎? – Giancarlo 2014-11-04 09:20:35

相關問題