Patrick Cuff 的解决方案通常有效,但如果前 2 个参数中的任何一个包含带引号的空格或特殊字符,它将失败。如果参数用空格以外的东西分隔,它也会失败。FOR /F 分隔符可以扩展为包含,
;
and =
,但是如果参数包含任何引用的分隔符,它将失败。
以下改进支持带引号的特殊字符,如&
and |
,但参数分隔符仍然是个问题。
@echo off
setlocal enableDelayedExpansion
set args=%*
for /f "tokens=1,2*" %%a in ("!args!") do (
endlocal
echo arg1=%%a arg2=%%b remainder=%%c
)
编辑 这是一个使用USEBACKQ的更简单的修改,它实现了同样的事情
for /f "usebackq tokens=1,2*" %%a in ('%*') do echo arg1=%%a arg2=%%b remainder=%%c
结束编辑
不幸的是,一个真正通用的解决方案需要一个从 3 开始解析每个参数的 GOTO 循环。只要所有引号都是平衡的并且所有特殊字符都被引用,下面的解决方案应该可以工作。
@echo off
setlocal
set "args="
:parseArgs
set args=%args% %3
shift /3
if "%~3" neq "" goto :parseArgs
if (%3) equ ("") goto :parseArgs
echo arg1=%1 arg2=%2 remainder=%args%
要消除所有限制需要采取严厉措施 - 请参阅如何接收最奇怪的命令行参数?