Windows 批处理脚本 - 将文件名读入变量

Windows Batch Script - Read file names into variables

我正在尝试一个一个地转换目录中的文件(电影)。每个新的、转换后的文件都需要分配一个新的文件名 - 旧文件有一个新的扩展名。

我尝试了以下方法来读取源文件,去掉扩展名并分配一个新的:

@echo off
setlocal DisableDelayedExpansion
cd \target_dir
for %%x in (*) do (
  echo %%x
  set source=%%x
  echo Source #%source%#
  set target=%source:.mpg=%
  echo Target #%target%#
  transcode %source% %target%.mp4
)

不幸的是,这不起作用。如输出所示,我什至无法将当前文件复制到变量 "source":

E:\target_dir>..\test.bat
movie1.mpg
source ##
target ##
movie2.mpg
source ##
target ##

我四处搜索并认为我找到了正确的语法,但事实并非如此。感谢您的帮助!

这个有效:

@echo off
cd \target_dir
for %%x in (*) do (
    transcode "%%x" "%%~nx.mp4"
)

请注意,您不能在标准环境变量上使用 %%~n 语法 - 您需要直接访问 for 循环变量。

编辑:添加引号使批处理也可以处理名称中包含空格的文件。

jlahd 显示了一个正确的解决方案,没有将文件名复制到变量。

但是我想解释一下你现在的问题。

As the output shows, I am not even managing to copy the current file into the variable "source":

您发现了 BBB(批量初学者错误),实际上您设置了变量,但后来无法访问内容。

这是批处理解析器处理代码块的结果,因为这些块被解析并且百分比扩展将在之前执行代码。
代码块是括号内的代码或由 &&&||.

连接的命令

为避免此问题,引入了延迟扩展。
然后你可以简单地使用 !variable! 在运行时扩展一个变量。

setlocal EnableDelayedExpansion
cd \target_dir
for %%x in (*) do (
  echo %%x
  set source=%%x
  echo Source #!source!#
  set target=!source:.mpg=!
  echo Target #!target!#
  transcode !source! !target!.mp4
)