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
albo if %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
lub IF 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 egeg IF [%1]==[a]
lub IF [%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%
C:\>set a=a b
C:\>echo %a%
a b
C:\>IF %a%=="a b" echo sdf
b=="a b" was unexpected at this time.
C:\>IF "%a%"=="a b" echo sdf
sdf
So ^^^ we want "%a%"
Podczas gdy jeśli% a% zawierałby cudzysłowy, byłby to inny przypadek
C:\>set a="a b"
C:\>echo %a%
"a b"
C:\>IF %a%=="a b" echo a
a
C:\>IF "%a%"=="a b" echo a
b""=="a b" was unexpected at this time.
C:\>
^^^^ So there we want %a% without quotes around it.
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 spacji
C: \> if [dab] == [dab] echo sdf
w tym czasie było nieoczekiwane.
Powiedz, if "d a b"
że to zadziała. Więc if "%1"
jest lepszy niż inne postacie takie jak if [%1]
lub a%1a
lub-%1
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.