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

Nol*_*nar 1 windows drag-and-drop batch-file

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

代码看起来像这样

@echo off
%~d0
cd %~p0
for %%f in (%*) do ...
pause
Run Code Online (Sandbox Code Playgroud)

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

经过一番研究,我发现,当我滴在批与名称的多个文件file(test)file test,%*解析

file(test) "file test"
Run Code Online (Sandbox Code Playgroud)

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

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

Nat*_*man 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
Run Code Online (Sandbox Code Playgroud)

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