Patrick Cuff的解決方案通常有效,但如果前2個參數中的任何一個包含帶引號的空格或特殊字符,它將會失敗。如果參數用空格以外的其他參數分隔,它也會失敗。 FOR/F分隔符可以擴展爲包括,
;
和=
,但如果參數包含任何引用的分隔符,它將會失敗。
以下改進支持引用的特殊字符,如&
和|
,但參數分隔符仍然存在問題。
@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
編輯完
不幸的是,真正通用的解決方案需要一個GOTO循環解析3中的每個參數。只要所有引號均衡並引用所有特殊字符,下面的解決方案應該可以工作。
@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%
爲了消除所有限制將需要嚴厲的措施 - 見How to receive even the strangest command line parameters?
只要前兩個參數都不包含帶引號的空格,就可以工作。但如果兩個參數中的任何一個引號包含空格,它將會失敗 - 可能不是用戶名或密碼的問題,作爲一般解決方案絕對不可接受。 – dbenham
@dbenham;你是正確的,通過任何種類的引用字符串,所有投注都關閉。 –
只要引號是平衡的,並且參數不包含空格或特殊字符(如'&''|'等),實際上引用的參數都可以。另一個潛在的問題 - 參數也可以用'''','或'='而不是空格。 – dbenham