2012-06-27 75 views

回答

3

您也可以使用陣列方法:

setlocal EnableDelayedExpansion 

set arg[1]=validArgument1 
set arg[2]=validArgument2 
set arg[3]=validArgument3 

for /L %%i in (1,1,3) do if /I "%1" equ "!arg[%%i]!" SET "ARG=!arg[%%i]!" 

在我看來,這種方法更清晰,更易於管理多個選項。例如,您可以創建的有效參數數組是這樣的:

set i=0 
for %%a in (validArgument1 validArgument2 validArgument3) do (
    set /A i+=1 
    set arg[!i!]=%%a 
) 

另一種可能性是定義一個變量對每個有效的參數:

for %%a in (validArgument1 validArgument2 validArgument3) do set %%a=1 

...然後只檢查參數如下:

if defined %1 (
    echo %1 is valid option... 
    SET ARG=%1 
) 
+0

這是非常感謝。我希望有一個更簡潔的方法來創建陣列,但這將完美地工作。 – justinhj

+0

@justinhj - 當你編輯某人的帖子時,你需要更加小心。你實際上引入了一個錯誤。它的工作原理與(for/L %% i in(1,1,3)'或'for %% i in(1,2,3)'一樣。但你在(1,2,3)'中編輯'for/L %% i'不會給出正確的答案。我編輯了答案,回到了Aacini原來的樣子。 – dbenham

+2

您的第二個選項需要處理未提供%1的情況。爲每個參數名稱添加一個虛擬前綴將解決它。 – Kevin

4

的魯棒的方法是使用延遲擴展

setlocal enableDelayedExpansion 
set "validArgs=;arg1;arg2;arg3;" 
if "!validArgs:;%~1;=!" neq "!validArgs!" set ARG=%1 

它也可以使用CALL與正常膨脹一起進行,但它更可能失敗,這取決於參數的值。上述

set "validArgs=;arg1;arg2;arg3;" 
call set "test=%%validArgs:;%~1;=%%" 
if "%test%" neq "%validArgs%" set ARG=%1 

這兩種技術都沒有有效的精氨酸可以包含=和args不能以*啓動的限制。

你也可以,只要使用下面的蠻力方法,沒有有效的args來包含*?,;=<space>

set "validArgs=arg1;arg2;arg3" 
for %%A in (%validArgs%) if /i "%~1"=="%%A" set ARG=%1 

你可能想看看這個argument parser。你可以調整這些代碼,或者爲你自己的獨特策略引發一些想法。

+0

Dave:你知道用不存在標籤的'call'命令不會中止程序執行嗎?看到凱文的解決方案下面... – Aacini

+0

我想你錯過了在最後一個循環 – Knitschi

相關問題