【发布时间】:2017-04-16 04:34:38
【问题描述】:
我正在尝试创建一个 for 循环,该循环将遍历一个目录并对该目录中的所有文件运行 ffmpeg 命令。我的问题是某些文件的名称中有!,这在使用延迟扩展时会导致问题。我研究了许多解决方案,但没有一个能帮到我。目前我可以回显包含! 的文件名,但我似乎无法将包含! 的文件名传递到我的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 消息。如果我在 echo 关闭后添加 SetLocal EnableDelayedExpansion 并将 ffmpeg 字符串更改为 ! 而不是 %,那么我再次收到 No such file or directory 消息。
我知道在 FOR 循环中,语句的 DO 部分中的所有内容都会在其他所有内容之前扩展,这就是我需要使用延迟扩展的原因,但是我怎样才能使用它并且仍然使用包含的文件名!?有没有办法让第一批接受名称中包含 ! 的文件?
【问题讨论】:
标签: batch-file for-loop cmd escaping