我正在尝试创建一个for循环,它将通过一个目录并对该目录中的所有文件运行ffmpeg命令。我的问题是某些文件的名称中有!
,这在使用延迟扩展时会导致问题。我研究了许多解决方案,其中没有一个能够让我找到任何地方。目前我可以使用包含的!
来回显文件名,但我似乎无法通过!
将文件名传递到我的for循环中,因为延迟扩展有效地删除了!
。批处理文件:转义!在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%"
然后,我可以得到的文件名和完整路径与包括!
呼应,但ffmpeg的命令引用%fname%
和%fpath%
返回No such file or directory
消息。如果我在SetLocal EnableDelayedExpansion
之后加上echo off并将ffmpeg字符串更改为!
而不是%
,那么我将再次获得No such file or directory
消息。
我知道,在声明的DO
部分FOR
环路一切都得到一切这就是为什么我需要使用延迟扩展前扩大,但我该如何使用,并仍在使用包含!
文件名?有没有办法让第一批接受名称中包含!
的文件?
你忘了提及没有需要CALL。 CALL会破坏包含'^'的任何名称。你的代码应该适用于所有情况。 – dbenham
出色的工作MC ND!这很简单,后见之明很有意义! – Trevor