バッチファイルを使用してすべてのサブフォルダーを削除しますか?

バッチファイルを使用してすべてのサブフォルダーを削除しますか?

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 よりもはるかに強力なので、使用してください。

インストールする必要がありますPowerShell 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
}

関連情報