W systemie Windows, jak uzyskać dostęp do argumentów przekazywanych podczas uruchamiania pliku wsadowego?
Na przykład, powiedzmy, że mam program o nazwie hello.bat
. Kiedy wchodzę hello -a
w wierszu poleceń systemu Windows, w jaki sposób mogę powiadomić program, że -a
został przekazany jako argument?
Odpowiedzi:
Jak powiedzieli już inni, dostęp do parametrów przekazywanych w wierszu poleceń można uzyskać w plikach wsadowych z notacją
%1
do%9
. Istnieją również dwa inne tokeny, których możesz użyć:%0
jest nazwą pliku wykonywalnego (pliku wsadowego) podaną w wierszu poleceń .%*
to wszystkie parametry podane w wierszu poleceń - jest to bardzo przydatne, jeśli chcesz przekazać parametry do innego programu.Istnieje również wiele ważnych technik, o których należy pamiętać, oprócz prostego dostępu do parametrów.
Sprawdzanie, czy parametr został przekazany
Odbywa się to za pomocą konstrukcji takich jak
IF "%~1"==""
, co jest prawdą wtedy i tylko wtedy, gdy w ogóle nie podano żadnych argumentów. Zwróć uwagę na znak tyldy, który powoduje usunięcie wszystkich otaczających cudzysłowów z wartości%1
; bez tyldy otrzymasz nieoczekiwane wyniki, jeśli ta wartość zawiera podwójne cudzysłowy, w tym możliwość wystąpienia błędów składniowych.Obsługa więcej niż 9 argumentów (lub po prostu ułatwianie życia)
Jeśli potrzebujesz dostępu do więcej niż 9 argumentów, musisz użyć polecenia
SHIFT
. To polecenie przesuwa wartości wszystkich argumentów o jedno miejsce, tak że%0
przyjmuje wartość%1
,%1
przyjmuje wartość%2
itd.%9
Przyjmuje wartość dziesiątego argumentu (jeśli jest obecny), który nie był dostępny dla żadnej zmiennej przed wywołaniemSHIFT
(enter KomendaSHIFT /?
aby uzyskać więcej opcji).SHIFT
przydaje się również, gdy chcesz łatwo przetwarzać parametry bez wymagania, aby były one prezentowane w określonej kolejności. Na przykład skrypt może rozpoznać flagi-a
i-b
w dowolnej kolejności. W takich przypadkach dobrym sposobem na przeanalizowanie wiersza poleceń jestTen schemat pozwala analizować dość złożone wiersze poleceń bez popadania w szaleństwo.
Zastąpienie parametrów partii
W przypadku parametrów, które reprezentują nazwy plików, powłoka zapewnia wiele funkcji związanych z pracą z plikami, które nie są dostępne w żaden inny sposób. Dostęp do tej funkcji można uzyskać za pomocą konstrukcji rozpoczynających się od
%~
.Na przykład, aby uzyskać rozmiar pliku przekazanego jako argument, użyj
Aby uzyskać ścieżkę do katalogu, z którego został uruchomiony plik wsadowy (bardzo przydatne!), Możesz użyć
Pełen zakres tych możliwości można wyświetlić, wpisując
CALL /?
w wierszu polecenia.źródło
"name=John"
będziename John
podczas exe. Aby obejść ten'"name=John"'
CALL /?
!? Tutaj przez cały czas wpadam na Google.Używanie parametrów w plikach wsadowych:% 0 i% 9
Pliki wsadowe mogą odnosić się do słów przekazanych jako parametry z tokenami:
%0
do%9
.parametry przekazywane w wierszu poleceń muszą być znakami alfanumerycznymi i być oddzielone spacjami. Ponieważ
%0
jest nazwą programu, tak jak został wywołany, w DOS%0
będzie pusty plik AUTOEXEC.BAT, jeśli zostanie uruchomiony w czasie rozruchu.Przykład:
Umieść następujące polecenie w pliku wsadowym o nazwie
mybatch.bat
:Wywołanie pliku wsadowego w ten sposób:
mybatch john billy
spowoduje wyświetlenie:Uzyskaj więcej niż 9 parametrów dla pliku wsadowego, użyj:% *
Token Percent Star
%*
oznacza „pozostałe parametry”. Możesz użyć pętli for, aby je złapać, jak zdefiniowano tutaj:http://www.robvanderwoude.com/parameters.php
Uwagi dotyczące ograniczników parametrów partii
Niektóre znaki w parametrach wiersza poleceń są ignorowane przez pliki wsadowe, w zależności od wersji DOS, niezależnie od tego, czy są „chronione”, czy nie, i często w zależności od ich położenia w wierszu poleceń:
źródło
Pliki wsadowe automatycznie przekazują tekst po programie, o ile ich zmienne są do przypisania. Są przekazywane w kolejności, w jakiej zostały wysłane; np.% 1 będzie pierwszym napisem wysłanym po wywołaniu programu itp.
Jeśli masz Hello.bat, a zawartość to:
i wywołujesz partię w poleceniu za pośrednictwem
powinieneś otrzymać z powrotem tę wiadomość:
Witam, dziękuję APerson241 za uruchomienie tego pliku wsadowego (11.01.2013)
źródło
@ Jon's
:parse
/:endparse
schemat to świetny początek i ma moją wdzięczność za wstępną przepustkę, ale jeśli myślisz, że torturujący system wsadowy Windows pozwoliłby ci tak łatwo… cóż, przyjacielu, czeka cię szok. Spędziłem cały dzień z tym diabelstwem i po wielu bolesnych badaniach i eksperymentach w końcu udało mi się uzyskać coś realnego do zastosowania w prawdziwym życiu.Powiedzmy, że chcemy wdrożyć narzędzie
foobar
. Wymaga początkowego polecenia. Ma opcjonalny parametr,--foo
który przyjmuje opcjonalną wartość (która oczywiście nie może być innym parametrem); jeśli brakuje wartości, domyślniedefault
. Ma również opcjonalny parametr,--bar
który przyjmuje wymaganą wartość. Wreszcie może przyjąć flagę--baz
bez dozwolonej wartości. Aha, i te parametry mogą przyjść w dowolnej kolejności.Innymi słowy, wygląda to tak:
Skomplikowane? Nie, to wydaje się dość typowe dla narzędzi z prawdziwego życia. (
git
ktoś?)Bez zbędnych ceregieli, oto rozwiązanie:
Tak, naprawdę jest tak źle. Zobacz mój podobny post na https://stackoverflow.com/a/50653047/421049 , gdzie przedstawiam dokładniejszą analizę tego, co dzieje się w logice i dlaczego użyłem pewnych konstrukcji.
Ohydny. Większość tego musiałem się dzisiaj nauczyć. I to bolało.
źródło
Użycie zmiennych tj te
.BAT
zmienne i nazywa%0
się%9
źródło