Übergeben von Befehlszeilenargumenten an ein Windows-Batch-Skript

10

Ich muss ein Windows-Batch-Skript erstellen, in dem ich einige Befehlszeilenargumente übergeben muss. Diese Argumente können in beliebiger Reihenfolge angezeigt werden, das Skript sollte sie jedoch anhand des Argumentnamens ordnungsgemäß erfassen. Z.B:

<scriptname> -age <agevalue> -gender <gender>
<scriptname> -gender <gender> -age <agevalue>

Das Skript kann auf eine der beiden oben genannten Arten aufgerufen werden, aber Alter und Geschlecht sollten richtig erfasst und Variablen zugewiesen werden. Die Argumente können durch den Schalter vor ihnen identifiziert werden - dh -age, -gender usw.

Kann mir bitte jemand ein Beispiel geben, wie ich dies intern identifizieren kann?

Dhiwakar Ravikumar
quelle

Antworten:

10

Batch hat leider keine eingebaute getopsFunktion wie . Sie könnten jedoch die Variante Ihres eigenen armen Mannes implementieren:

:GETOPTS
 if /I %~1 == --age set AGE=%2& shift
 if /I %~1 == --gender set GENDER=%2& shift
 shift
if not (%1)==() goto GETOPTS
Mureinik
quelle
Dies kann umständlich sein, da die Anzahl der Argumente überschritten wird, aber es passt zur Rechnung. Danke
Dhiwakar Ravikumar
1
Nach robvanderwoude.com/if.php ist es besser zu schreiben if /I "%~1" == "--age" ... (beachten Sie die Tilde). Dies funktioniert auch für leere Parameter oder Parameter, die in doppelte Anführungszeichen gesetzt werden.
Axel Kemper
Möglicherweise möchten Sie die doppelten Anführungszeichen hinzufügen. Andernfalls funktioniert die Anweisung nicht mit dem leeren Parameter% 1.
Axel Kemper
Wenn Ihre verschiedenen möglichen Argumente ein festgelegtes Format oder einen festgelegten Typ haben, z. B. Alter (numerisch) und Geschlecht ("M" oder "F"), sollten Sie die Argumente nicht definieren müssen, sondern sie mithilfe der Vergleichserkennung zuweisen die entsprechenden Variablen im Skript. Ich habe dies für ein frühes Batch-Skript getan, das ich während einer Übergangszeit zwischen 9x und XP bei meinem ersten IT-Job geschrieben habe. Das Skript kann entweder Argumente für den Betriebssystemtyp, das Laufwerk, von dem aus das Skript ausgeführt wurde, und einige andere Dinge akzeptieren oder die entsprechenden Einstellungen automatisch erkennen. Ein bisschen übertrieben, aber eine lustige Übung.
music2myear
8

Schaffst du das mit Powershell? oder muss es chargenweise sein? Powershell macht es schön und einfach. Sie müssen nur so etwas oben in Ihr Skript einfügen und können dann jeden Parameter in beliebiger Reihenfolge aufrufen

param (
[string]$Age,
[string]$Gender
)

Sie können dies mit Batch tun, aber es erfordert viele Parameterprüfungen. Hier sind einige Links einiger Batch-Skripte, die dies tun

http://www.ericphelps.com/batch/samples/arguments.bat.txt

(Mögliches Dupplikat von)

/programming/5215729/is-there-a-way-to-pass-parameters-by-name-and-not-by-order-to-a-batch-bat-f

mrwhale
quelle
1
Es müssen nur Batch-Skripte sein :(. Wir haben eine strikte Anforderung, dass es ein Batch-Skript sein muss. Vielen Dank :)
Dhiwakar Ravikumar