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
)
我正在尝试一个一个地转换目录中的文件(电影)。每个新的、转换后的文件都需要分配一个新的文件名 - 旧文件有一个新的扩展名。
我尝试了以下方法来读取源文件,去掉扩展名并分配一个新的:
@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
)