バッチ処理で指定文字列を含まないファイルを削除するには?

投稿者: Anonymous

windows10 64bit環境です。
//forで.mp3ファイルを順に処理対象にする

for /F %%a in ('dir /b *.mp3') do (
    echo.%%a
)

//hogeを含まない.mp3を削除
//仮にfuga.mp3が処理対象だったら

set str1=fuga.mp3
if x%str1:hoge=%==x%str1% (
    del %str1%
)

これらを組み合わせて

@echo on
setlocal enabledelayedexpansion
for /F %%a in ('dir /b *.mp3') do (
    set str1=%%a
    if x!str1:hoge=!==x!str1! (
        echo.!str1!
    )
)
pause

このように処理したのですが
エラーなのかすぐにコマンド入力画面が消えます。
そしてファイルも削除できません。

解決方法をお教えいただけると大変助かります。
よろしくお願いいたします。

解決

cmd.exeを立ち上げておいてその中で提示されたbatを実行すると、pauseに至る前に下記のコードで=!==x!str1! の使い方が誤っています。というエラーを吐いて終了します。
pauseに至る前に終了しているので、エラーを吐いてすぐにコマンド入力画面が消えます。

if x!str1:hoge=!==x!str1! (

単純にファイル名に特定の文字を含まないファイルを削除するだけなら、下記のコードで実現できそうですがいかがでしょうか。

rem ファイル名に"fuga"を含まないものをすべて削除する
for /f "delims=" %%a in ('dir /B *.mp3 ^| find /V "fuga"') do del %%a

ただしこのコードはフォルダを再帰的にたどってファイルを削除できません。
再帰的に削除したい場合は改修が必要なのでご留意願います。

dir/sスイッチを追加することで再帰的に削除すること自体は可能ですが、その場合フォルダ名まで削除判定文字列に含まれてしまうため。fugaフォルダ内のファイルは削除されません。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *