29267
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
    
```

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

解決方法をお教えいただけると大変助かります。  
よろしくお願いいたします。
CC BY-SA 3.0
2016-09-30T02:32:40.980
29258
2016-10-02T00:14:49.657
2016-09-30T09:39:57.053
12778
question
windows batch-file
バッチ処理で指定文字列を含まないファイルを削除するには？
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フォルダ内のファイルは削除されません。
CC BY-SA 3.0
2016-09-30T10:38:46.553
29267
2016-10-02T00:14:49.657
2016-10-02T00:14:49.657
9820
9820
29258
answer