使用批次檔刪除所有子資料夾?

使用批次檔刪除所有子資料夾?

要刪除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
}

相關內容