ファイル名が文字化けして開けない場合の処置

一部アプリは扱えない文字があり、ファイル名にそういった文字が入っていると処理を行えません。そんなときは処理前にリネームすると実行できます。バッチファイルのforコマンド内の処理ならリネームして処理を行ったあとに元の名前に戻せます。

コマンドラインアプリ
開けないファイル

「⧸test⧸.m4a」という一部アプリで扱えない文字が入っているファイルを実行します。

C:\aacgain /e /r /c /p ⧸test⧸.m4a
?test?.m4a
Can't open ?test?.m4a for reading

すると「⧸」が「?」に化けてしまい、ファイルを開けず処理が行えません。

処理の前後でリネーム実行

処理したいファイルがあるフォルダにバッチファイルを作成して以下のようなforコマンドを記述します。

for %%a in (*.m4a) do (
ren "%%a" @.m4a
aacgain /e /r /c /p @.m4a
ren @.m4a "%%a"
)

「ren "%%a" @.m4a」でファイル名を適当な文字「@」などに変更してから実行します。

@.m4a
Applying mp3 gain change of -8 to @.m4a...

正常に処理が終わり、「ren @.m4a "%%a"」で一時的に変更した名前を元に戻して終了です。

ファイル名の「@」は一部アプリで処理を実行できないことがあります。

遅延環境変数

「setlocal enabledelayedexpansion」を実行すると、ファイル名に感嘆符(!)を含むものが扱えなくなります。

for %%a in (*.txt) do (
ren "%%a" @.txt
setlocal enabledelayedexpansion
遅延環境変数を使う処理
endlocal
ren @.txt "%%a"
)

遅延環境変数を使いたいところを「setlocal」「endlocal」で挟みます。その前後で適当な名前にリネームして、処理が終わったら元の名前にリネームすれば、感嘆符入りのファイルを処理できます。

デスクトップアプリ

1ファイルずつアプリを起動終了させる手動操作になりますが、Windowsアプリで使えなくもないです。

for %%a in (*.wav *.flac *.mp3 *.opus *.wma *.mp4 *.dsf) do (
ren "%%a" "@%%~xa"
"C:\Program Files\Upconv\upconvfe.exe"
ren "@_upconv082.flac" "%%~na.flac"
del "@%%~xa" "@_upconv082.wav"
)

バッチの途中で記述したWindowsアプリが起動すると処理が一時停止します。その間に立ち上がったアプリでリネームしたファイルを読み込んで処理を行い、アプリのウインドウを閉じると残りのバッチが実行されてファイル名を元に戻せます。

inserted by FC2 system