我想編寫一個批處理文件來清理我的整個C盤通過使用命令行刪除其中的所有空目錄。 它可行嗎?有沒有辦法刪除我的電腦中的所有空目錄使用命令行
回答
編輯到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
似乎我無法正確理解這個問題,通過相反的順序排序這個列表意味着什麼?我是否也需要在「root =%mydirectory%」中指定我的目錄?對不起,我很新的批處理文件 – Giancarlo 2014-11-04 08:51:30
@Giancarlo,一個遞歸的'dir'命令將返回一個父文件夾的所有後代之前。由於所有後代共享相同的父前綴,按降序對列表進行排序(「排序/ r」所做的操作)可確保列表中較深的(子)文件夾包含在父列表之前。所以,如果子刪除產生一個空的父親,父母也將被刪除。是的,您必須根據需要更改變量,例如'set「root = c:\」'('C' drive)或'set「root =%temp%」'(臨時文件夾)。但正如npocmaka在其答案中指出的那樣,請小心刪除系統驅動器中的文件夾。 – 2014-11-04 09:16:49
謝謝,除了此代碼外,還可以排除「Windows」文件夾嗎? – Giancarlo 2014-11-04 09:20:35
- 1. shell命令刪除空的__init__.py文件的所有目錄
- 2. 當我沒有使用名稱空間時,是否有辦法刪除redis中的所有sidekiq相關條目?
- 3. 有沒有辦法使用c#和MS Access刪除表中的所有行?
- 4. 有沒有辦法檢查空目錄?
- 5. 有沒有辦法使用通配符刪除與命令行SVN?
- 6. 有沒有辦法在所有Heroku dynos上運行命令?
- 7. 有沒有辦法刪除目錄中最舊的文件?使用c#
- 8. 有沒有辦法控制JPA級聯刪除命令?
- 9. 有沒有辦法刪除未使用的JS庫的行?
- 10. 有沒有辦法在jQuery中刪除所有名稱空間的綁定?
- 11. 有沒有辦法刪除Xcode項目中的所有1x圖像?
- 12. 有沒有辦法列出用戶可以執行的所有命令(KSH)?
- 13. 有沒有辦法讓gradle執行$ path中的命令行
- 14. 有沒有辦法使用Notepad ++刪除文件中的所有註釋?
- 15. 命名空間沒有從DataContractSerializer的XML根目錄中刪除
- 16. 有沒有辦法在Teradata中使用一個命令刪除所有易失性表?
- 17. 有沒有辦法使用命令行創建一個新的XCode項目?
- 18. 如何刪除在Windows中使用命令行的目錄和子目錄的所有用戶的權限?
- 19. 命令刪除所有kubernetes命名空間中的所有豆莢
- 20. 有沒有辦法從TableLayoutPanel的一行中刪除所有控件?
- 21. 有沒有辦法刪除Sublime Text 3中的所有註釋行?
- 22. 空目錄(刪除所有文件)
- 23. 有沒有辦法從字符串中刪除所有空格? javascript
- 24. 有沒有辦法讓現有的cmd窗口執行命令?
- 25. 的qemu-kvm的命令沒有發現在我的電腦
- 26. 即使沒有指定,Unix命令刪除了每個目錄
- 27. PHP刪除的目錄都是空的所有文件和所有子目錄
- 28. Unix命令刪除目錄中的所有文件,但保留目錄
- 29. 使用Windows遞歸執行所有目錄中的命令
- 30. 有沒有辦法告訴Doxygen忽略(所有)命名空間?
注意,這將是一個壞主意。其中一些空目錄可能對操作系統或應用程序的正常運行至關重要。 – 2014-11-05 02:08:15