Krótka odpowiedź - użyj nawiasów kwadratowych:
if [%1]==[] goto :blank
lub (jeśli potrzebujesz obsługiwać cytowane argumenty, zobacz Edycję poniżej):
if [%~1]==[] goto :blank
Czemu? możesz zapytać. Cóż, tak jak wspomniał Jeremiah Willcock: http://ss64.com/nt/if.html - używają tego! OK, ale co jest nie tak z cudzysłowami?
Ponownie, krótka odpowiedź: są „magiczne” - czasami podwójne (podwójne) cudzysłowy są zamieniane na pojedynczy (podwójny) cudzysłów. I na początek muszą pasować.
Rozważ ten mały skrypt:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
Przetestujmy to:
C:\> argq bla bla
bla
bla
Done.
Wydaje się działać. Ale teraz przejdźmy na drugi bieg:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Boom To nie zostało ocenione jako prawda, ani też nie zostało ocenione jako fałszywe. Skrypt ZMARŁ. Jeśli miałbyś wyłączyć reaktor gdzieś na linii, cóż - pech. Umrzesz teraz jak Harry Daghlian.
Możesz pomyśleć - OK, argumenty nie mogą zawierać cudzysłowów. Jeśli tak, to się dzieje. Źle Oto pociecha:
C:\> argq ""bla bla""
""bla
bla""
Done.
O tak. Nie martw się - czasem to będzie działać.
Wypróbujmy inny skrypt:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
Możesz sam sprawdzić, czy w powyższych przypadkach działa poprawnie. To logiczne - cudzysłowy nie mają nic wspólnego z nawiasami, więc nie ma tu magii. Ale co z doprawieniem argumentów nawiasami?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
Nie ma szczęścia. Nawiasy po prostu nie mogą zablokować cmd.exe
parsera.
Wróćmy na chwilę do złych cytatów. Problem pojawił się, gdy argument kończył się cytatem:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
Co jeśli zdam tylko:
D:\>argq bla2"
The syntax of the command is incorrect.
Skrypt w ogóle się nie uruchomi. To samo dotyczy args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
Ale co otrzymam, gdy liczba "
-znaków „pasuje” (czyli - jest parzysta), w takim przypadku:
D:\>args bla2" "bla3
bla2" "bla3
Done.
MIŁE - mam nadzieję, że nauczyłeś się czegoś o tym, jak .bat
pliki dzielą swoje argumenty wiersza poleceń (WSKAZÓWKA: * To nie jest dokładnie tak, jak w bashu). Powyższy argument zawiera spację. Ale cytaty nie są usuwane automatycznie.
A argq? Jak to na to reaguje? Przewidywalnie:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
A więc - pomyśl, zanim powiesz: „Wiesz co? Po prostu używaj cudzysłowów. [Bo dla mnie to wygląda ładniej]”.
Edytować
Niedawno pojawiły się komentarze na temat tej odpowiedzi - cóż, nawiasy kwadratowe „nie radzą sobie” z przekazywaniem cytowanych argumentów i traktowaniem ich tak, jakby nie były cytowane.
Składnia:
if "%~1"=="" (...)
Nie jest jakąś nowo odkrytą zaletą podwójnych cudzysłowów, ale przejawem zgrabnej funkcji usuwania cudzysłowów ze zmiennej argumentu, jeśli pierwszy i ostatni znak jest cudzysłowem podwójnym.
Ta „technologia” działa równie dobrze w przypadku nawiasów kwadratowych:
if [%~1]==[] (...)
Warto było zwrócić na to uwagę, więc głosuję również za nową odpowiedzią.
Wreszcie, fani podwójnych cudzysłowów, czy ""
w waszej książce istnieje argument w formie , czy jest on pusty? Tylko pytam' ;)
GOTO BLANK
wierszu) do pozostałych dwóchIF
instrukcji, czy to rozwiąże problem?