我编写了一个视频转换批处理,用户只需将视频从任意磁盘或分区拖放到批处理中,之后转换后的视频将保存在特定磁盘上的特定位置。
代码看起来像这样
@echo off
%~d0
cd %~p0
for %%f in (%*) do ...
pause
实际问题在于(%*)
当我的文件名称中有一个结束圆括号时,批处理将不起作用。为了解决这个问题,我使用了("%*")
,但这不适用于名称中包含空格或多个文件的文件。
我也试过(%~*)
,但这是无效的。
经过一些研究后,我注意到,当我在批处理中删除名称为file(test)
和file test
的多个文件时,%*
会解析为
file(test) "file test"
这意味着文件名可能带引号,或者不是......
我的问题是:我该如何处理?
理想情况下,我希望%*
解析为"file(test)" "file test"
(两个名称都用引号括起来)
答案 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时,所有内容都引用了它。