如何处理批处理文件中%*的不一致文件名格式

时间:2013-03-11 19:14:24

标签: windows batch-file drag-and-drop

我编写了一个视频转换批处理,用户只需将视频从任意磁盘或分区拖放到批处理中,之后转换后的视频将保存在特定磁盘上的特定位置。

代码看起来像这样

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

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

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

file(test) "file test"

这意味着文件名可能带引号,或者不是......

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

1 个答案:

答案 0 :(得分: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时,所有内容都引用了它。