Chciałbym znaleźć partię Bash dla Windows, $@
która zawiera listę wszystkich argumentów przekazanych do skryptu.
A może muszę się przejmować shift
?
źródło
Chciałbym znaleźć partię Bash dla Windows, $@
która zawiera listę wszystkich argumentów przekazanych do skryptu.
A może muszę się przejmować shift
?
dancavallaro ma rację, %*
dla wszystkich parametrów wiersza poleceń (z wyjątkiem samej nazwy skryptu). Przydatne mogą być również:
%0
- komenda używana do wywołania pliku wsadowego (może być foo
, ..\foo
, c:\bats\foo.bat
, itd.)
%1
To pierwszy parametr wiersza poleceń,
%2
to drugi parametr linii poleceń,
i tak dalej aż do %9
(iSHIFT
mogą być wykorzystywane do tych po 9).
%~nx0
- rzeczywista nazwa pliku wsadowego, niezależnie od metody wywołania (some-batch.bat)
%~dp0
- dysk i ścieżka do skryptu (d: \ scripts)
%~dpnx0
- to pełna nazwa ścieżki skryptu (d: \ scripts \ some -batch.bat)
Więcej informacji przykłady na https://www.ss64.com/nt/syntax-args.html i https://www.robvanderwoude.com/parameters.html
%~dpn0
co zwróci dysk i ścieżkę do skryptu oraz nazwę pliku wsadowego, ale nie rozszerzenie. Uważam to za szczególnie przydatne podczas tworzenia skryptów wsadowych, które wywołują.ps1
plik o tej samej nazwie. Zasadniczod
odnosi się do dysku,p
odnosi się do ścieżki,n
odnosi się do nazwy pliku ix
odnosi się do rozszerzenia. Dzięki tym informacjom możesz wiele zrobić.@echo %~n0.my_ext
%*
wydaje się, że zawiera wszystkie argumenty przekazane do skryptu.źródło
&
? Kiedy próbuję pobrać kilka ścieżek kilku wybranych plików (używając menu Wyślij do i „% *”, które przekazują argumenty do pliku .py), zatrzymuje listę przy znakach &. Jeśli więc na przykład drugi plik zawiera&
nazwę, część nazwy po&
znaku zostanie pominięta, a także pozostałe pliki.)&
to znak specjalny, który oznaczastop this command and start another one
. Nazwa pliku zawierająca&
MUSI być cytowana.%1
...%n
i%*
przechowuje argumenty, ale dostęp do nich może być trudny, ponieważ treść zostanie zinterpretowana.Dlatego niemożliwe jest radzenie sobie z czymś takim za pomocą zwykłych instrukcji
Każda linia kończy się niepowodzeniem, ponieważ cmd.exe próbuje wykonać jeden z ampersandów (zawartość% 1 to
"&"&
)Istnieje jednak obejście z plikiem tymczasowym
Sztuką jest włączenie
echo on
i rozwinięcie instrukcji%1
afterrem
(działa również z% 2 ..% *).Ale aby móc przekierować wyjście
echo on
, potrzebujesz dwóch FOR-LOOPS.Dodatkowe znaki
* #
są używane, aby zabezpieczyć się przed takimi treściami jak/?
(pokaże pomoc dla REM).Lub karetka ^ na końcu linii może działać jako znak wielowierszowy.
FOR / F powinien działać z opóźnionym rozszerzaniem wyłączonym, w przeciwnym razie zawartość „!” zostanie zniszczony.
Po usunięciu dodatkowych znaków
param1
i masz go.Aby używać
param1
w bezpieczny sposób, włącz opóźnioną ekspansję.Edycja: Jedna uwaga do% 0
%0
zawiera polecenie użyte do wywołania partii, zachowując także wielkość liter, jak w przypadkuFoO.BaT
Ale po wywołaniu funkcji,
%0
a także%~0
zawiera nazwę funkcji (lub lepiej ciąg, który został użyty do wywołania funkcji).Ale
%~f0
nadal możesz przypomnieć sobie nazwę pliku.Wynik
źródło
%~f0
Sztuczka jest całkowicie nieoczekiwana, fajna i potencjalnie bardzo przydatna :-) Nic dziwnego, że inne modyfikatory działają w ten sam sposób, zawsze działając na nadrzędnym pliku wsadowym, nawet gdy są w tak zwanym podprogramie. Wydaje się to warte własnych pytań i odpowiedzi - „Jak uzyskać dostęp do nazwy uruchomionej partii, gdy jest ona wywoływana podprogramem?”Zauważyłem, że następnym razem, gdy będziesz musiał sprawdzić te informacje. Zamiast otwierać przeglądarkę i google, możesz po prostu wpisać
call /?
cmd, a otrzymasz:źródło
Sposób na odzyskanie wszystkich argumentów do skryptu jest tutaj:
źródło
%%I
bądź interpretowany i może zepsuć twój skrypt.Oto dość prosty sposób na uzyskanie argumentów i ustawienie ich jako zmiennych env. W tym przykładzie będę po prostu nazywał je Kluczami i Wartościami.
Zapisz następujący przykład kodu jako „args.bat”. Następnie wywołaj plik wsadowy zapisany z wiersza polecenia. przykład: arg.bat --x 90 --y 120
Podałem kilka poleceń echa, które przeprowadzą cię przez ten proces. Ale końcowy wynik jest taki, że --x będzie miało wartość 90, a --y będzie miało wartość 120 (to znaczy, jeśli uruchomisz przykład jak podano powyżej ;-)).
Następnie możesz użyć instrukcji warunkowej „jeśli zdefiniowano”, aby ustalić, czy uruchomić blok kodu. Powiedzmy, więc uruchom: „arg.bat --x hello-world” Mógłbym wtedy użyć wyrażenia „JEŚLI OSTATECZNIE - x echo% - x%”, a wynikiem byłoby „hello-world”. Bardziej sensowne powinno być uruchomienie partii.
źródło
Obs: Do użytku bez:
?*&<>
źródło
Poniższy kod symuluje tablicę ('
params
') - pobiera parametry otrzymane przez skrypt i zapisuje je w zmiennychparams_1
..params_n
, gdzien
=params_0
= liczba elementów tablicy:źródło
Jeśli masz parametry w cudzysłowie zawierające spacje,
%*
nie będzie działać poprawnie. Najlepszym rozwiązaniem, jakie znalazłem, jest pętla łącząca wszystkie argumenty: https://serverfault.com/a/22541źródło
Możesz użyć
For
Commad, aby uzyskać listę Arg.Pomoc:
For /?
Pomoc:Setlocal /?
Oto moja droga =
Nie potrzebujesz polecenia Shift.
źródło
źródło
Wiele powyższych informacji doprowadziło mnie do dalszych badań i ostatecznie mojej odpowiedzi, więc chciałem przekazać to, co skończyłem, mając nadzieję, że pomoże to komuś innemu:
Chciałem również przekazać zmienną liczbę zmiennych do pliku wsadowego, aby mogły być przetwarzane w tym pliku.
Nie przeszkadzało mi przekazywanie ich do pliku wsadowego za pomocą cudzysłowów
Chciałbym, aby były przetwarzane podobnie jak poniżej - ale używając pętli zamiast pisać ręcznie:
Więc chciałem to wykonać:
I za pomocą magii pętli for wykonaj to w pliku wsadowym:
Problemem było to, że wszystkie moje próby użycia pętli for nie działały. Poniższy przykład:
po prostu zrobiłby:
i nie:
nawet po ustawieniu
Powodem było to, że pętla for odczytała całą linię i przypisała mój drugi parametr do %% B podczas pierwszej iteracji pętli. Ponieważ% * reprezentuje wszystkie argumenty, do przetworzenia jest tylko jedna linia - ergo następuje tylko jedno przejście pętli for. Okazuje się, że jest to zgodne z projektem, a moja logika była błędna.
Przestałem więc próbować używać pętli for i uprościłem to, co próbowałem zrobić, używając instrukcji if, shift i goto. Zgodziłem się, że to trochę hack, ale bardziej odpowiada moim potrzebom. Mogę przeglądać wszystkie argumenty, a następnie użyć instrukcji if, aby wyjść z pętli po przetworzeniu ich wszystkich.
Zwycięskie oświadczenie za to, co próbowałem osiągnąć:
AKTUALIZACJA - musiałem zmodyfikować poniżej, ujawniłem wszystkie zmienne środowiskowe, próbując odwołać się do% 1 i używając shift w ten sposób:
źródło
Czasami muszę wyodrębnić kilka parametrów wiersza poleceń, ale nie wszystkie i nie z pierwszego. Załóżmy następujące połączenie:
Oczywiście rozszerzenie „.bat” nie jest potrzebne, przynajmniej masz test.exe w tym samym folderze. Chcemy uzyskać wynik „tres cuatro cinco” (bez względu na to, czy jedna linia, czy trzy). Chodzi o to, że tylko ja potrzebuję trzech parametrów i zaczynam od trzeciego. Aby mieć prosty przykład, akcja dla każdego z nich to po prostu „echo”, ale możesz pomyśleć o innej, bardziej złożonej akcji nad wybranymi parametrami.
Przedstawiłem kilka przykładów (opcji), abyś mógł zobaczyć, który z nich uważasz za lepszy. Niestety, nie ma przyjemnego (lub nie wiem o tym) sposobu opartego na pętli for w zakresie takim jak „for %% i in (% 3, 1,% 5)”.
Prawdopodobnie możesz znaleźć więcej opcji lub połączyć kilka. Ciesz się nimi.
źródło
Wersja Windows (wymaga jednak socat)
konfigurowanie:
źródło