批处理文件:转义!在For Loop中

Tre*_*vor 1 for-loop cmd escaping batch-file

我正在尝试创建一个for循环,它将通过一个目录并对该目录中的所有文件运行ffmpeg命令.我的问题是,某些文件!的名称在使用延迟扩展时会导致问题.我研究了很多解决方案,但没有一个能让我到任何地方.目前我可以用!包含的方式回显文件名,但我似乎无法通过!my 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
Run Code Online (Sandbox Code Playgroud)

这适用于没有!名称的所有文件.如果我使用这样的批处理脚本:

@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%"
Run Code Online (Sandbox Code Playgroud)

然后我可以使用!包含的文件名和完整路径来回显,但是ffmpeg命令引用%fname%%fpath%返回一条No such file or directory消息.如果我在SetLocal EnableDelayedExpansion回显关闭后添加并更改ffmpeg字符串!而不是%,那么我再次收到No such file or directory消息.

我知道在FOR循环DO中,语句部分中的所有内容都会扩展到其他所有内容之前,这就是我需要使用延迟扩展的原因,但是我如何使用它仍然使用包含的文件名!?有没有办法让第一批接受!名称中的文件?

MC *_* ND 5

最简单的解决方案是不使用延迟扩展.

@echo off
    setlocal enableextensions disabledelayedexpansion
    set ffmpegArguments=-vcodec copy -acodec copy -scodec copy -vbsf h264_changesps=level=40 -vbsf h264_changesps=fps=24000:1001

    for %%f in ("Y:\Samples\Test Videos\*.mkv") do (
        ffmpeg -i "%%f" %ffmpegArguments% "E:\Converted\%%~nxf" 
    )
    pause
Run Code Online (Sandbox Code Playgroud)

无需将从for可替换参数检索到的信息分配给变量,只需使用检索到的值即可