2012-06-27 10 views

Antwort

3

Sie können auch den Array Ansatz verwenden:

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]!" 

Meiner Meinung nach ist diese Methode ist klarer und einfacher mit mehreren Optionen zu verwalten. Zum Beispiel können Sie das Array von gültigen Argumente auf diese Weise erstellen:

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

Eine andere Möglichkeit ist es, eine Variable für jedes gültige Argument zu definieren:

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

... und dann einfach überprüfen der Parameter auf diese Weise:

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

Das ist großartig, danke. Ich wünschte, es gäbe einen präziseren Weg, Arrays zu erstellen, aber das wird perfekt funktionieren. – justinhj

+0

@justinhj - Sie müssen vorsichtiger sein, wenn Sie jemand anderen bearbeiten. Sie haben tatsächlich einen Fehler eingeführt. Es funktioniert so, wie es ursprünglich mit 'for/L %% i in (1,1,3)' oder als 'for %% i in (1,2,3)' geschrieben wurde. Aber Ihre Bearbeitung von 'für/L %% i in (1,2,3)' wird nicht die richtige Antwort geben. Ich habe die Antwort darauf geändert, wie Aacini es ursprünglich hatte. – dbenham

+2

Ihre zweite Option muss den Fall behandeln, in dem% 1 nicht angegeben ist. Das Hinzufügen eines Dummy-Präfixes zu jedem Argumentnamen würde dies auflösen. – Kevin

4

Eine robuste Methode ist, verzögerten Expansion

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

nennt es auch getan werden kann, verwenden Verwendung zusammen mit normaler Expansion, aber es ist wahrscheinlicher, zum Scheitern verurteilt, je nach dem Wert des Parameters.

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

Beide Techniken haben oben eine Einschränkung, dass keine gültige arg = und args darf nicht anspringen, mit * enthalten.

Sie könnten auch die folgenden Brute-Force-Methode verwenden, solange keine der gültigen Argumente enthalten *?,;= oder <space>

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

Sie können einen Blick auf diese argument parser haben wollen. Sie könnten diesen Code anpassen oder Ideen für Ihre eigene Strategie entwickeln.

+0

Dave: wussten Sie, dass 'Aufruf' Befehl mit einem nicht vorhandenen Label _not_ Programmausführung nicht abbricht? Siehe Kevins Lösung unter ... – Aacini

+0

Ich glaube, du hast in der letzten For-Schleife einen Fehler gemacht – Knitschi