Przekazywanie argumentów wiersza polecenia do skryptu wsadowego systemu Windows

10

Muszę utworzyć skrypt wsadowy systemu Windows, w którym muszę przekazać kilka argumentów wiersza polecenia. Argumenty te mogą pojawiać się w dowolnej kolejności, ale skrypt powinien je poprawnie odebrać na podstawie nazwy argumentu. Na przykład:

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

Skrypt można wywołać na jeden z dwóch powyższych sposobów, ale wiek i płeć powinny być odpowiednio wybrane i przypisane do zmiennych. Argumenty można rozpoznać po przełączniku przed nimi - tj. -Age, -gender itp.

Czy ktoś może podać mi przykład wewnętrznej identyfikacji?

Dhiwakar Ravikumar
źródło

Odpowiedzi:

10

batch niestety nie ma wbudowanej getopsfunkcji jak . Możesz jednak wdrożyć własny wariant biedaka:

:GETOPTS
 if /I %~1 == --age set AGE=%2& shift
 if /I %~1 == --gender set GENDER=%2& shift
 shift
if not (%1)==() goto GETOPTS
Mureinik
źródło
może to być kłopotliwe, ponieważ liczba argumentów przekracza, ale pasuje do rachunku. Dzięki
Dhiwakar Ravikumar,
1
Po robvanderwoude.com/if.php lepiej byłoby pisać if /I "%~1" == "--age" ... (zwróć uwagę na tyldę). Działa to również w przypadku pustych parametrów lub parametrów, które są umieszczone w cudzysłowach.
Axel Kemper
Możesz dodać podwójne cudzysłowy. W przeciwnym razie instrukcja nie będzie działać z pustym parametrem% 1.
Axel Kemper
Jeśli różne możliwe argumenty mają ustawiony format lub typ, takie jak wiek (liczba) i płeć (liczba „M” lub „F”), nie należy definiować argumentów, lecz zamiast tego użyć rozpoznania porównania, aby przypisać je do odpowiednie zmienne w skrypcie. Zrobiłem to dla wczesnego skryptu wsadowego, który napisałem podczas okresu przejściowego między 9x a XP podczas mojej pierwszej pracy IT. Skrypt może zaakceptować argumenty dotyczące typu systemu operacyjnego, dysku, z którego skrypt był uruchamiany i kilka innych rzeczy, lub może automatycznie wykryć odpowiednie ustawienia. Trochę przesada, ale fajne ćwiczenie.
music2myear
8

Czy możesz to zrobić za pomocą Powershell? czy to musi być partia? Powershell sprawia, że ​​jest to przyjemne i łatwe, wystarczy dodać coś takiego na górze skryptu, a następnie można wywołać każdy parametr w dowolnej kolejności

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

Możesz to zrobić wsadowo, ale będzie to wymagało wielu kontroli parametrów. Oto kilka linków niektórych skryptów wsadowych, które to robią

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

(Możliwy duplikat)

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

mrwhale
źródło
1
to muszą być tylko skrypty wsadowe :(. Mamy ścisły wymóg, aby był to skrypt wsadowy. Bardzo dziękuję :)
Dhiwakar Ravikumar