W szczególności mam problemy ze zrozumieniem łączników w następujących wierszach, które pochodzą z wikibooks
if not -%1-==-- echo Argument one provided
if -%1-==-- echo Argument one not provided & exit /b
Aby sprawdzić, czy zmienna istnieje lub jest zdefiniowana, są zasadniczo dwa sposoby, których nauczyłem się tutaj :
IF DEFINED MyVar (ECHO MyVar IS defined) ELSE (ECHO MyVar is NOT defined)
IF "%MyVar%"=="" (ECHO MyVar is NOT defined) ELSE (ECHO MyVar IS defined)
Więc co (1) łączniki wokół argumentu% 1 i (2) łączniki po znaku ==?
for %1 in (*.*) do @echo %1
a byłoby to dwuznaczne, aby zrobić to w pliku wsadowym, więc w przypadku instrukcji znajdujących się w pliku wsadowym użyj %%, ale parametry wsadowe (które są zawsze tylko w pliku wsadowym) to zawsze% 1 ,% 2 itd.Odpowiedzi:
Rozważ to
Powinno być oczywiste, że znak minus / łącznik jest po prostu używany do ułatwienia wyznaczenia pustej wartości. Ten konkretny symbol nie ma specjalnego znaczenia w tym wyrażeniu - jest traktowany jak każdy inny nietypowy znak.
Możemy dodać spacje, aby wyjaśnić, że
==
operator nie jest modyfikowany przez otaczające znakiZasadniczo lepiej jest stosować konwencjonalne podejścia, które więcej osób zrozumie od razu (np. Użycie znaków cudzysłowu).
W przypadku systemu DOS i być może wczesnych wersji systemu Windows uważam, że wystąpiły pewne problemy (których nie pamiętam) przy użyciu znaków cudzysłowu, które doprowadziły do tego, że ludzie używali w ten sposób znaków do wydruku. Nie próbowałem przypadku, w którym% 1 zawiera na przykład znak cudzysłowu.
źródło
defined
słowa kluczowego, aby sprawdzić, czy parametr istnieje. ObaIF DEFINED %1
iIF DEFINED %%1
wydają się nie działać. Czy dałbyś mi jakieś wskazówki?Jest to ważne, gdy używasz% 1 do umieszczenia czegoś wokół niego, aby zapobiec zerwaniu pliku wsadowego, gdy% 1 jest pusty, ponieważ% 1 nie jest zmienną, zostaje podstawiona wartością, jak np. Wstrzyknięcie SQL jako przykład wstrzyknięcia wsadowego i gdy wartość jest niczym, a% 1 jest w JEŻELI, wtedy zostaje uszkodzony kod.
if %1==""
staje sięif == ""
i daje błąd.Jeśli chodzi o to, dlaczego jeśli zdefiniowane nie działa na% 1,% 1 jest wartością, a nie zmienną, więc zdefiniowane tam nie działa. Aby kod działający dla% 1 był pusty, potrzebujesz kodu, który nie ulegnie uszkodzeniu, gdy% 1 zostanie zastąpiony niczym. Spróbuj
if "%1"==""
lub spróbujif [%1]==[]
Można powiedzieć, że% 1 wygląda trochę myląco, nie wygląda mi to na dobrą konwencję! Technicznie można nawet zrobić
if a%1==a%1
alboif %1a==%1a
ale konwencja wydaje się być[]
Możesz użyć cudzysłowów, [] lub dowolnych znaków. Ale jak zauważył supercat w komentarzu, cytaty nie są dobrym pomysłem w przypadku% 1. (Ponieważ jeśli% 1 zawiera spacje, użytkownik dołącza cudzysłowy do tego, co zostaje przekazane jako% 1, a jeśli jest% w spacji i w pliku wsadowym wstawiasz cudzysłowy wokół% 1, cytaty zostaną anulowane i niecytowane miejsce spowoduje błąd).
Jeśli robisz IF w wierszu poleceń i nie testujesz żadnej zmiennej, nie masz% 1 i nawet nie potrzebujesz []. Powiedziałbyś
IF "a b c"=="a b c" echo a
lubIF a==b echo a
Jeśli w pliku wsadowym często masz% 1, a zamiast cudzysłowów wokół% 1, użyj np. Jednego lub dwóch znaków np.[%1]
I użyj cudzysłowów, jeśli chcesz zachować spacje i nie jest to% 1 egegIF [%1]==[a]
lubIF [%1]==["a b"] echo a
Nie rób,"%1"
ponieważ% 1 może już zawierać cytaty, które zostaną anulowane, a następnie, jeśli% 1 ma spację, instrukcja if łamie się.Jeśli byłeś w linii poleceń i testowałeś zmienną, to zależy od tego, czy zmienna ma cudzysłowy. Możesz spojrzeć na zawartość.
Zmienna może mieć spację i nie zawierać cudzysłowów.
Tak więc w tym konkretnym przypadku wiersza polecenia, umieszczanie cudzysłowów w okolicach% a% nie spowoduje podwójnego cudzysłowu, a jeśli chcesz przetestować względem „a b”, musisz wstawić cudzysłowy wokół% a%
Podczas gdy jeśli% a% zawierałby cudzysłowy, byłby to inny przypadek
Wszystko więc zależy od tego, czy zmienna lub parametr zawiera cudzysłowy. Jeśli% 1 ma spacje, będzie zawierał cudzysłowy. Wiemy więc, że gdybyśmy porównali% 1 z „a b”, to w nie zrobiłby „% 1”. A gdyby% 1 nie zawierał cudzysłowów, nie zawierałby spacji, więc nie zrobilibyśmy „% 1”. Myślę, że nigdy nie chciałbyś robić „% 1”. Tak więc, jeśli% 1 zawiera spacje, w% 1 pojawią się cudzysłowy, a spacje zostaną już zachowane.
Przekreśliłem poniżej w świetle komentarza superkata. I dodałem więcej do mojego postu powyżej.
Cytaty są najlepsze w okolicach% 1, a nie [] lub niektórych znaków, takich jak A lub -, ponieważ na przykład jeśli użyjesz [], to nie zachowa spacjiC: \> if [dab] == [dab] echo sdf
w tym czasie było nieoczekiwane.
Powiedz,if "d a b"
że to zadziała. Więcif "%1"
jest lepszy niż inne postacie takie jakif [%1]
luba%1a
lub-%1
źródło
%1
będzie rozwinięcie się do czegoś zawierającego spacje, jeśli argument zawiera znaki cudzysłowu. W takim przypadku otoczenie%1
ze znakami cudzysłowu spowoduje zepsute zachowanie, a otoczenie go czymś innym powinno działać.if "" 2""==""2"" echo a
zawodzi. A na wypadek, gdyby nikt nie wiedział ... Efektem""
będzie włączenie lub wyłączenie cytowania."asdf""asdf"
nie łączy dwóch osobnych obiektów. Pierwszy „oznacza włączenie trybu, w którym zachowane są spacje i niektóre inne znaki. Następny” oznacza wyłączenie tego trybu. Następny włącza. Możesz więc powiedzieć „asdf asdf” lub powiedzieć „asdf" "asdf
Więc2""
nie powinno to wyglądać zbyt skomplikowane”. (ale czasem zastanawianie się, jak działa cmd / partia, jest trudne)echo 2
nie ma konwersji 2 na ciąg. Przypuszczam, że technicznie z komputerami wszystko to jest zakodowane (nie powiem znaków) zawijasy / glify. Niektórzy mogą spojrzeć na prezentację, jeśli są cytatami lub nie, a następnie potraktować ją odpowiednio jako liczbę (do obliczeń) lub ciąg znaków (w celu posortowania ich alfabetycznie). Lub tak jak zakodowane glify są to liczby lub ciągi znaków.Nie jestem pewien, czy to rozumiesz, więc pozwól mi zobaczyć, czy mogę to uprościć.
Załóżmy, że plik wsadowy otrzymuje wartość
%1
z wiersza poleceń i chcesz sprawdzić, czy jest to „kot” czy „pies”. Możesz to sprawdzić:%1
zastępuje się tekstem kot lub pies (powiedzmy pies), więc tłumacz naprawdę to widzi:Ale jeśli osoba uruchamiająca skrypt nie podała wartości w wierszu poleceń, interpreter zobaczy to:
To jest niepoprawna składnia i spowoduje błąd. Konwencja polega więc na tym, aby dołączyć 1 lub więcej znaków i najpierw sprawdzić brak zmiennej, coś takiego:
Jeśli
%1
nic nie zostanie ocenione, dodatkowe znaki są nadal dostępne, aby zachować poprawną składnię. Używam*
, ale często pojawiają się cytaty lub wykrzykniki, takie jak"%1"
lub%1!
, a także łączniki, takie jak--%1
lub-%1-
itp.Człowieku, nie mogę uwierzyć, że wciąż to wszystko pamiętam. :-) Mam nadzieję, że to pomoże!
źródło