要刪除bin
當前路徑中任何子資料夾的所有資料夾,我有以下腳本,這是我嘗試過的(據我對批次腳本的了解):
setlocal enabledelayedexpansion
for /f %%i in ('dir /a:d /s /b *')
do
(
set d=!i!\bin
if exist !d! rd !d!
)
endlocal
它不起作用,看起來甚至有一些語法錯誤。但要弄清楚它是什麼是很痛苦的。當我從 運行批次檔時cmd
,它會顯示如下內容:
/s was unexpected at this time.
請注意,為了運行該批次文件cmd
,我必須將其更改為%%
,%
否則它會抱怨
The syntax of the command is incorrect.
因此,如果我們想運行來自 的批次文件cmd
,我們需要先將所有內容替換%%
為,這是可笑的嗎%
?真的:D 如果直接運行批次檔(透過雙擊它),控制台視窗會立即關閉,而不會給我任何機會查看問題所在。我什至嘗試PAUSE
在末尾添加一個,以便它可以暫停,但它也不起作用(我知道在此之前存在一些錯誤,使得暫停也不起作用)。
回到我原來的問題,因為我不知道這裡出了什麼問題(從 報告的消息cmd
)我真的陷入了困境。希望你們能發現我的腳本中的錯誤並幫助我修復它。
答案1
@echo off
cd/d "%~dp0"
for /f delims^= %%i in (
'dir /a:d/s/b ^| findstr /eil "\bin \obj"'
)do echo; rd "%%~i"
觀察次數:1它的語法傾向於服務其他語言,但不服務於 bat/cmd 腳本,這個循環不能以這種方式工作...
for /f %%i in ('loop command') do ( // dynamic variable %%i can be expanded, that // doesn't mean it will be treated/expanded // like a regular variable %i% at runtime !i! )
命令的語法不正確。
- 觀察次數:2程式碼會在螢幕上產生一個列表,運行/刪除資料夾,
echo;
如果輸出看起來正確,請刪除
其他資源:
答案2
使用 PowerShell,因為它比 cmd 更強大。
你需要安裝電源外殼7,那麼您可能還想安裝Windows 終端,如果您不知道如何安裝和打開它們,有大量的在線教程比我更好地解釋了該過程,所以我不會在這裡重複。
pwsh.exe
以管理員權限執行:
Win+ R-> 類型pwsh.exe
-> Ctrl+ Shift+Enter
然後,在控制台中,取得「Path\to\folder」內的所有項目:
Get-ChildItem -Path "Path\to\folder" -Force -Recurse
只列出子目錄:
Get-ChildItem -Path "Path\to\folder" -Force -Recurse -Directory
根據模式過濾第一個指令的輸出:
Get-ChildItem -Path "Path\to\folder" -Force -Recurse | Where-Object {$_.Name -match 'bin|obj' }
刪除鏈中前一個連結過濾的所有項目:
Get-ChildItem -Path "Path\to\folder" -Force -Recurse | Where-Object {$_.Name -match 'bin|obj' } | Remove-Item -Recurse -Force -Confirm:$false
上面做了你想要的,path\to\folder是一個佔位符,將其更改為實際(絕對)路徑,例如,如果路徑是“D:\MyFolder”,請將其更改為“D:\ MyFolder”, 'bin|obj' 是一個正規表示式,如果您需要其他模式,請將其替換為您需要的模式,要建構模式,只需使用垂直管道連接選項。將路徑和模式用引號引起來。
警告:上面會自動刪除正確指定的所有內容,而不會提示確認,如果您還沒準備好,請不要執行它。
現在來縮短整個過程:
gci "Path\to\folder" -Fo -R | % {$_.Name -match 'bin|obj' } | ri -R -Fo -Con:$false
將程式碼包含在函數中以提高可重複使用性:
function remove-filtered ($path, $pattern) {
Get-ChildItem -Path $path -Force -Recurse | Where-Object {$_.Name -match $pattern } | Remove-Item -Recurse -Force -Confirm:$false
}