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中,语句部分中的所有内容都会扩展到其他所有内容之前,这就是我需要使用延迟扩展的原因,但是我如何使用它仍然使用包含的文件名!?有没有办法让第一批接受!名称中的文件?
最简单的解决方案是不使用延迟扩展.
@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可替换参数检索到的信息分配给变量,只需使用检索到的值即可
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |