忍者ブログ

空フォルダを消すクリーナバッチを改良

2022年04月30日
昨日からバッチファイルの勉強してて、書籍を1つ読破。

前にネットからまるパクリした空のフォルダをまとめて削除するバッチ
ソースを見返してみたけど理解できず。

本とネットを駆使してようやく理解できた。



●空フォルダ削除
for /f %%A in ('dir /ad /b') do rd %%A
※ フォルダ名にスペースが入ってると消してくれない


%%Aがループで使用する変数。
('dir /ad /b')がディレクトリ内の全フォルダを取得するコマンド。
今回、フォルダを対象とするので、
dirコマンドで一覧を取得。/ad:フォルダのみを対象に /b:フォルダ名だけ取得
for文の中で文字列として受け取るので /f
取得したフォルダ名が%%Aに入ってるので、rdコマンドで削除。

実はオプションなしでrdコマンドを打つと空フォルダしか消さない。

空じゃないフォルダも消すならrd /s /q とサブフォルダを対象にして
確認メッセージをスキップするオプションを指定する必要がある。
(win10環境だと/sでいけた。書籍は古いのでdeltreeで消すって書いてあった。)


※で書いた弱点克服のために試行錯誤。
"usebackq"オプションをつけてみたけどうまくいかず。rd "%%A"もだめ。
そして気づいた。そもそも全然違うことに。

改めて調べてみたらここがわかりやすい。
https://www.javadrive.jp/command/bat/index9.html#section1

カレントディレクトリにあるディレクトリの分だけ繰り返す
FOR /D %%変数 IN (セット) DO コマンド
for /d %%A in (*) do rm %%A

バッチファイルのあるディレクトリの空フォルダを消す正しいコマンド。
スペースの入ったフォルダも対象にするには""でくくればOK。やっと弱点克服。

●最終的なコマンド
for /d %%A in (*) do rm "%%A"

どのファイルを消したかとか見たければ、最後にpauseを付ける。
するとコマンドプロンプトウィンドウが表示されたままになる。

以下、ソースと結果(%0でバッチファイル名を取得できる)
こんな簡単に結果を見れるならVBScriptよりも使いやすいよなぁ・・・。



'------------------------------------------------ソース
@echo %0の実行結果
del *.zip
for /d %%A in (*) do rd "%%A"
pause

'------------------------------------------------結果
"C:\test\del_Zip_and_Enptyfolder2.bat"の実行結果

C:\test>del *.zip
C:\test\*.zip が見つかりませんでした。

C:\test>for / %A in (*) do rd "%A"

C:\test>rd "Empty Folder"

C:\test>rd "EmptyFolder"

C:\test>rd "NotEmpty"
ディレクトリが空ではありません。

C:\test>pause
続行するには何かキーを押してください . . .


PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字