Po prostu przekonwertowałem niektóre skrypty powłoki na pliki wsadowe i wydaje mi się, że jest jedna rzecz, której nie mogę znaleźć ... a jest to prosta liczba argumentów wiersza poleceń.
na przykład. Jeśli masz:
myapp foo bar
W skorupkach:
- $ # -> 2
- $ * -> foo bar
- $ 0 -> myapp
- $ 1 -> foo
- 2 $ -> bar
W partii
- ?? -> 2 <---- jakie polecenie ?!
- % * -> foo bar
- % 0 -> myapp
- % 1 -> foo
- % 2 -> bar
Rozejrzałem się więc dookoła i albo szukam w złym miejscu, albo jestem ślepy, ale nie mogę znaleźć sposobu na obliczenie liczby przekazanych argumentów wiersza poleceń.
Czy istnieje polecenie podobne do polecenia powłoki „$ #” dla plików wsadowych?
ps. najbliższe, jakie znalazłem, to iteracja przez% 1s i użycie 'shift', ale muszę ponownie sprawdzić% 1,% 2 itd. w dalszej części skryptu, więc to nie jest dobre.
shell
batch-file
scripting
pyko
źródło
źródło
2 myapp foo bar
?Odpowiedzi:
Trochę googlując daje następujący wynik z wikibooków :
Wygląda na to, że cmd.exe wyewoluował trochę ze starego DOSa :)
źródło
for
działa tylko dla argumentów, które wyglądają jak nazwy plików, a nie dla łańcuchów opcji, takich jak-?
. Używanie cudzysłowów (for %%i in ("%*") ...
) działa w przypadku argumentów podobnych,-?
ale znowu kończy się niepowodzeniem dla argumentów cytowanych w cudzysłowie z powodu zagnieżdżonych cudzysłowów. Wydaje się, że jedyną solidną metodą jestshift
…MyBatchFile "*.*" "Abc"
zgłasza, że argC == 9. - Głosowano w dół.Masz tendencję do obsługi wielu argumentów za pomocą tego rodzaju logiki:
itp.
Jeśli masz więcej niż 9 argumentów, to takie podejście nie daje Ci rady. Istnieją różne sposoby tworzenia liczników, które można znaleźć tutaj , ale ostrzegam, że nie są one dla osób o słabych nerwach.
źródło
shift
liczyć więcej niż 9 ... i bez 10 linii równie wyglądającego kodu.Poniższa funkcja
:getargc
może być tym, czego szukasz.Zasadniczo wykonuje iterację raz po liście (która jest lokalna dla funkcji, więc przesunięcia nie wpłyną na listę z powrotem w głównym programie), zliczając je, aż się wyczerpie.
Używa również sprytnej sztuczki, przekazując nazwę zmiennej zwracanej, która ma być ustawiona przez funkcję.
Główny program po prostu ilustruje, jak go wywołać, i wyświetla później argumenty, aby upewnić się, że są nietknięte:
źródło
echo Count is %argc%
można wstawić własny kod, który mógłby sprawdzić, czy ta liczba jest poprawna, a następnie przejść dalej.Spróbuj tego:
źródło
Jeśli liczba argumentów powinna być dokładną liczbą (mniejszą lub równą 9), to w prosty sposób można to sprawdzić:
źródło
Unika używania jednego
shift
lubfor
cyklu kosztem rozmiaru i czytelności.Wynik:
EDYCJA: Zastosowana tutaj „sztuczka” obejmuje:
Skonstruowanie łańcucha, który reprezentuje aktualnie ocenianą zmienną argumentu wiersza polecenia (np. „% 1”, „% 2” itp.) Przy użyciu łańcucha zawierającego znak procentu (
%%
) i zmienną licznikaarg_idx
w każdej iteracji pętli.Przechowywanie tego ciągu w zmiennej
curr_arg_label
.Przekazanie zarówno tego ciągu (
!curr_arg_label!
), jak i nazwy zmiennej zwracanej (curr_arg_value
) do podprogramu pierwotnegoget_value
.W podprogramie wartość pierwszego argumentu (
%1
) jest używana po lewej stronie przypisania (set
), a wartość drugiego argumentu (%2
) po prawej stronie. Jednak przekazanie argumentu drugiego podprogramu powoduje, że interpreter poleceń przekształca go na wartość argumentu wiersza poleceń programu głównego. Oznacza to, że przekazywane jest nie, na przykład, „% 4”, ale jakąkolwiek wartość przechowuje czwarta zmienna argumentu wiersza poleceń (w przykładowym użyciu „inny_arg”).Następnie zmienna przekazana do podprogramu jako zmienna zwracana (
curr_arg_value
) jest testowana pod kątem niezdefiniowania, co mogłoby się zdarzyć, gdyby nie było aktualnie obliczanego argumentu wiersza poleceń. Początkowo było to porównanie wartości zmiennej zwracanej zawiniętej w nawiasy kwadratowe z pustymi nawiasami kwadratowymi (jest to jedyny znany mi sposób testowania argumentów programu lub podprogramu, który może zawierać cudzysłowy i był przeoczoną pozostałością po fazie prób i błędów), ale został od tego czasu naprawiony tak, jak jest teraz.źródło
Ostatnia odpowiedź była dwa lata temu, ale potrzebowałem wersji na więcej niż dziewięć argumentów wiersza poleceń. Może być inny też ...
Rozwiązanie to pierwsze 19 wierszy i konwertuje wszystkie argumenty na zmienne w stylu c. Wszystkie inne rzeczy po prostu sondują wynik i pokazują konwersję na lokalne argumenty. Możesz odwoływać się do argumentów według indeksu w dowolnej funkcji.
źródło
Solidnym rozwiązaniem jest delegowanie liczenia do podprogramu wywoływanego za pomocą
call
; podprogram używagoto
instrukcji do emulacji pętli, w którejshift
używa się iteracyjnie argumentów (tylko podprogram):źródło