私はディレクトリを通過し、そのディレクトリ内のすべてのファイルにffmpegコマンドを実行するforループを作成しようとしています。私の問題は、遅延拡張を使用するときに問題の原因となるファイルの一部に、名前に!
が含まれていることです。私は多くのソリューションを研究しており、誰も私をどこにでも連れて来ない。現在、!
が含まれているファイル名をエコー表示できますが、!
のファイル名をforループに渡すことはできません。遅延拡張によって効果的に!
が削除されます。バッチファイル:Escaping! Forループ内
@echo off
setlocal enabledelayedexpansion
for %%f in ("Y:\Samples\Test Videos\*.mkv") do (
set "filename=%%~nxf"
ffmpeg -i "%%f" -vcodec copy -acodec copy -scodec copy -vbsf h264_changesps=level=40 -vbsf h264_changesps=fps=24000:1001 "E:\Converted\!filename!"
)
pause
これは名前に!
せずにすべてのファイルを正常に動作します:
は、ここに私のバッチスクリプトです。私はこのようなバッチスクリプトを使用する場合:
@echo off
for %%f in ("Y:\Samples\Test Videos\*.mkv") do (
call :command "%%f"
)
pause
:command
set "fname=%~nx1"
set "fpath=%~dpnx1"
echo %fname%
ffmpeg -i %fpath% -vcodec copy -acodec copy -scodec copy -vbsf h264_changesps=level=40 -vbsf h264_changesps=fps=24000:1001 "E:\Converted\%fname%"
それから私は、ファイル名と完全なパスが含ま!
でエコーするために得ることができますが、%fname%
と%fpath%
を参照ffmpegのコマンドはNo such file or directory
メッセージを返します。エコーをオフにした直後にSetLocal EnableDelayedExpansion
を追加し、ffmpegの文字列を%
の代わりに!
に変更した場合、再びNo such file or directory
というメッセージが表示されます。
私は声明のDO
一部でFOR
ループのすべてで、私は遅れて拡張を使用する必要がある理由である他のすべての前に展開されることを知っているが、私はそれを使用してすることができますどのように、まだ!
を含むファイル名を使用できますか?名前に!
のファイルを受け入れる最初のバッチを取得する方法はありますか?
あなたはCALLの必要はないと言及するのを忘れました。 CALLは '^'を含む名前を破壊します。あなたのコードはすべての場合に有効です。 – dbenham
優秀作品MC ND!それは簡単で、後ろ向きには非常に意味があります! – Trevor