Ich benötige meine bat-Datei, um mehrere optionale benannte Argumente zu akzeptieren.
mycmd.bat man1 man2 -username alice -otheroption
Zum Beispiel hat mein Befehl zwei obligatorische Parameter und zwei optionale Parameter (-username) mit dem Argumentwert alice und -otheroption:
Ich möchte diese Werte in Variablen umwandeln können.
Rufen Sie einfach jemanden an, der dies bereits gelöst hat. Mann, diese Fledermausfeilen sind ein Schmerz.
batch-file
Hühnchen-Keks
quelle
quelle
http://web.archive.org/web/20090403050231/http://www.pcguide.com/vb/showthread.php?t=52323
.Antworten:
Obwohl ich eher damit einverstanden bin Kommentar von @AlekDavis , gibt es in der NT-Shell mehrere Möglichkeiten, dies zu tun.
Der Ansatz, den ich mit dem Befehl SHIFT und der bedingten Verzweigung von IF nutzen würde , so etwas in der Art ...
quelle
SHIFT /2
Verschiebungen ab Argument 2. Es wird nicht zweimal verschoben. Sollte es nicht durch ersetzt werdenSHIFT & SHIFT
?mycmd.bat -username anyvalue -username myName -otheroption othervalue
. Das Ergebnis sollte user = myName, other = othervalue sein; Der Code gibt jedoch user = -username, other = othervalue an. Der Fehler wird durch Ersetzen fixiertSHIFT /2
mitSHIFT & SHIFT
.;
- es kann nicht anstelle von verwendet werden&
.%1
und%2
wurden "verwendet". b) Die SingleSHIFT
in Zeile 11 verschiebt den Wert von%2
um 1 Position nach unten und ist dann (wieder) als verfügbar%1
, und der Wert "Nicht verwendet" von%3
ist als verfügbar%2
. c) InIF
Zeile 13 wird dieser bereits "Verwendete" Wert angezeigt, von%2
dem jetzt in%1
. d) Wenn der "Benutzername" aus Zeile 10 so aussieht"-otheroption"
, wird er erneut verwendet undother
auf den neuen Wert in gesetzt%2
, der wahrscheinlich der Name der nächsten Option war. --->-otheroption
kein Wert gefolgt, daher war er wahrscheinlich als Typoption gedacht-Flag
und sollte kein zweites Argument verbrauchen. 3. Wenn das Argument%1
nicht von den internenIF
Anweisungen behandelt wird, wird es stillschweigend ignoriert. Der Code sollte wahrscheinlich eine Meldung anzeigen, die angibt, dass es sich nicht um eine gültige Option handelt. Dies kann durch Hinzufügen der erforderlichen AnweisungenSHIFT
undGOTO :loop
Anweisungen zu den internenIF
Anweisungen oder durch Hinzufügen einerELSE
Anweisung erfolgen.Die ausgewählte Antwort funktioniert, könnte aber verbessert werden.
Meine Lösung basiert auf der Erstellung einer OPTIONS-Variablen, die alle Optionen und ihre Standardeinstellungen definiert. OPTIONEN wird auch verwendet, um zu testen, ob eine bereitgestellte Option gültig ist. Eine enorme Menge an Code wird gespeichert, indem die Optionswerte einfach in Variablen gespeichert werden, die den gleichen Namen wie die Option haben. Die Codemenge ist unabhängig von der Anzahl der definierten Optionen konstant. Nur die OPTIONS-Definition muss geändert werden.
BEARBEITEN - Außerdem muss sich der: -Schleifencode ändern, wenn sich die Anzahl der obligatorischen Positionsargumente ändert. Beispielsweise werden häufig alle Argumente benannt. In diesem Fall möchten Sie Argumente ab Position 1 anstelle von 3 analysieren. In der: -Schleife werden also alle 3 zu 1 und 4 zu 2.
Es gibt wirklich nicht so viel Code. Der größte Teil des obigen Codes besteht aus Kommentaren. Hier ist genau der gleiche Code ohne die Kommentare.
Diese Lösung bietet Argumente im Unix-Stil innerhalb eines Windows-Stapels. Dies ist nicht die Norm für Windows - Batch hat normalerweise die Optionen vor den erforderlichen Argumenten und den Optionen wird ein Präfix vorangestellt
/
.Die in dieser Lösung verwendeten Techniken lassen sich leicht an einen Windows-Optionsstil anpassen.
%1
und wird fortgesetzt, bis arg 1 nicht mit beginnt/
/
.SET /VAR=VALUE
schlägt fehlSET "/VAR=VALUE"
funktioniert. Ich mache das sowieso schon in meiner Lösung./
. Diese Einschränkung kann beseitigt werden, indem eine implizit definierte//
Option verwendet wird, die als Signal zum Verlassen der Optionsanalyse-Schleife dient. Für die//
"Option" wird nichts gespeichert .Update 28.12.2015: Unterstützung für
!
In-OptionswerteIm obigen Code wird jedes Argument erweitert, während die verzögerte Erweiterung aktiviert ist. Dies bedeutet, dass
!
es höchstwahrscheinlich entfernt wird oder dass etwas Ähnliches!var!
erweitert wird. Darüber hinaus^
kann auch abgestreift werden, wenn!
vorhanden. Die folgende kleine Änderung am nicht kommentierten Code hebt die Einschränkung auf, sodass!
und^
in Optionswerten beibehalten werden.quelle
Wenn Sie optionale Argumente, aber keine benannten Argumente verwenden möchten, hat dieser Ansatz für mich funktioniert. Ich denke, dies ist viel einfacher zu befolgen.
quelle
IF "%1"==""
schlägt fehl, wenn das Argument selbst Anführungszeichen enthält. Verwenden Sie stattdessen einfach ein anderes nicht spezielles Symbol, z. B. ._ = [] # etcEinmal hatte ich ein Programm geschrieben, das die Argumente short (-h), long (--help) und non-option in der Batch-Datei verarbeitet. Diese Techniken umfassen:
Nicht-Optionsargumente, gefolgt von Optionsargumenten.
Shift-Operator für Optionen ohne Argument wie '--help'.
Zwei-Zeit-Shift-Operator für die Optionen, für die ein Argument erforderlich ist.
Durchlaufen Sie eine Beschriftung, um alle Befehlszeilenargumente zu verarbeiten.
Beenden Sie das Skript und beenden Sie die Verarbeitung für die Optionen, für die keine weiteren Aktionen erforderlich sind, z. B. '--help'.
Schrieb Hilfefunktionen für die Benutzerführung
Hier ist mein Code.
quelle
Hier ist der Argumentparser. Sie können beliebige Zeichenfolgenargumente (unberührt) oder maskierte Optionen (Einzel- oder Options- / Wertepaare) mischen. Um es zu testen, kommentieren Sie die letzten 2 Anweisungen aus und führen Sie sie aus als:
Escape char ist definiert als
"_SEP_=/"
, bei Bedarf neu definieren.quelle
Erstellung dynamischer Variablen
Vorteile
%1
,%2
...%*
in Takt/arg
und-arg
StilNachteile
setlocal
für das lokale Scoping oder schreiben Sie eine Begleitung:CLEAR-ARGS
Routine!--force
zum-f
)""
ArgumentunterstützungVerwendung
Hier ist ein Beispiel, wie sich die folgenden Argumente auf .bat-Variablen beziehen:
Implementierung
quelle
:ARG-PARSER
Routine auch in eine externe .bat-Datei verschiebenarg-parser.bat
, um sie auch anderen Skripten zur Verfügung zu stellen.