1

我写了一个视频转换批处理,用户可以简单地将他的视频从任何磁盘或分区拖放到批处理上,之后转换后的视频将保存在特定磁盘的特定位置。

代码看起来像这样

@echo off
%~d0
cd %~p0
for %%f in (%*) do ...
pause

实际问题出在(%*).
当我的文件名称中有一个右圆括号时,批处理将不起作用。为了解决这个问题,我使用("%*")了 ,但这不适用于名称中包含空格的文件或多个文件。
我也试过,(%~*)但这是无效的。

经过一些研究,我注意到,当我在批处理中删除多个文件时,名称为file(test)and file test%*解析为

file(test) "file test"

这意味着文件名可能有引号,也可能没有......

我的问题是:我该如何处理?
理想情况下,我想%*解决"file(test)" "file test"(两个名字都用引号括起来)

4

1 回答 1

5

您可以使用每个参数调用一个子例程,而不是使用for循环,一次一个。

:nextArgument
set arg=%~1
if not defined arg goto :eof
call :processFile "%arg%"
shift
goto nextArgument

:processFile
set file=%~1
echo "%file%"
:: do your processing here
goto :eof

这将一次处理每个以空格分隔的参数(但引用的参数可以包含空格),并将它们传递给 processFile 例程。我%~1先从参数中删除引号,然后在调用 processFile 时重新添加引号。这样我就知道当我到达 processFile 时,所有内容都有引号。

于 2013-03-11T19:21:53.503 回答