如何在批处理文件中的变量中转义某个字符

如何在批处理文件中的变量中转义某个字符

我编写了这个脚本,但是它不起作用:

for /R %%f in (*.mkv) do (
 ffmpeg -i "%%f" -vf subtitles="%%~nf.mkv" -acodec copy "%%~nf.mp4"
 )

 PAUSE

经过查找问题,我发现问题在于文件名,方括号必须转义(例如[1080p]coolvid.mp4应该变成\[1080p\]coolvid.mp4。我该如何对文件名(即%%f)这样做?

答案1

方括号必须转义

使用以下批处理文件:

@echo off
setlocal
setlocal enabledelayedexpansion
for /r %%f in (*.mkv) do (
  set _a=%%~nf
  set _b=!_a:[=\[!
  set _name=!_b:]=\]!
  set _c=%%f
  set _d=!_c:[=\[!
  set _fullname=!_d:]=\]!
  ffmpeg -i "!_fullname!" -vf subtitles="!_name!.mkv" -acodec copy "!_name!.mp4"
  )
endlocal
pause

进一步阅读


编辑: 如果遇到包含该!字符的文件(或文件路径),原始代码将失败,因为已启用延迟扩展,并且 FOR 变量在延迟扩展之前进行扩展。因此,带有 的名称!将被破坏。

通过在循环内切换延迟扩展 ON 和 OFF 可以轻松解决这个问题,这样在启用延迟扩展时不会扩展任何 FOR 变量。

@echo off
setlocal disableDelayedExpansion
for /r %%f in (*.mkv) do (
  set _a=%%~nf
  set _c=%%f
  setlocal enableDelayedExpansion
  set _b=!_a:[=\[!
  set _name=!_b:]=\]!
  set _d=!_c:[=\[!
  set _fullname=!_d:]=\]!
  ffmpeg -i "!_fullname!" -vf subtitles="!_name!.mkv" -acodec copy "!_name!.mp4"
  endlocal
)
endlocal
pause

相关内容