質問: 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フォルダ内のファイルは削除されません。