2012-09-07 126 views
5

我想使用傳遞給批處理文件的前2個參數,然後將其他所有內容附加到批處理文件中執行的命令。如何將額外的額外參數傳遞給批處理文件?

有沒有簡單的方法來做到這一點?

// batch file 
command -Duser=%1 -Dpwd=%2 {? how to pass all remaining arguments on the command line} 

批次將這樣

batch.bat USR PWD -Dargument1=1 -Dargument2=2 

有效地執行,我想執行

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2 

回答

3

for命令應該給你你想要的東西:

for /f "tokens=1,2*" %%a in ("%*") do echo command -Duser=%%a -Dpwd=%%b %%c 

從幫助forfor /?):


FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 將解析在myfile.txt中的每一行,忽略以 一開始的行分號,將每行的第2個和第3個標記傳遞給 正文,標記由逗號和/或空格分隔。 請注意,對於 正文陳述引用%i得到第二個標記,%j獲得第3個標記 ,%k獲取第3個標記之後的所有剩餘標記。對於 包含空格的文件名,您需要用 雙引號引用文件名。爲了以這種方式使用雙引號,您還需要使用usebackq選項 ,否則雙引號將被解釋爲定義要解析的文字字符串的 。


所以在我的解決方案,%%a擁有的第一個參數傳遞給腳本的餘下的參數值,%%b的第二個參數的值,並%%c

當我從命令提示符下運行batch.bat USR PWD -Dargument1=1 -Dargument2=2我得到:

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2 

do後刪除echo調用的論據你的命令。

+1

只要前兩個參數都不包含帶引號的空格,就可以工作。但如果兩個參數中的任何一個引號包含空格,它將會失敗 - 可能不是用戶名或密碼的問題,作爲一般解決方案絕對不可接受。 – dbenham

+0

@dbenham;你是正確的,通過任何種類的引用字符串,所有投注都關閉。 –

+0

只要引號是平衡的,並且參數不包含空格或特殊字符(如'&''|'等),實際上引用的參數都可以。另一個潛在的問題 - 參數也可以用'''','或'='而不是空格。 – dbenham

1

這可能是你想要的下面

C:>help shift 
Changes the position of replaceable parameters in a batch file. 

SHIFT [/n] 

If Command Extensions are enabled the SHIFT command supports 
the /n switch which tells the command to start shifting at the 
nth argument, where n may be between zero and eight. For example: 

    SHIFT /2 

would shift %3 to %2, %4 to %3, etc. and leave %0 and %1 unaffected. 
+0

但它不會幫助這裏,因爲SHIFT只具有參數'%1'..'%9'但不是效果'%*'。所以沒有一個簡單的方法來獲取所有參數,但沒有一些前綴參數 – jeb

2

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?

相關問題