Коротка відповідь - використовуйте квадратні дужки:
if [%1]==[] goto :blank
або (коли вам потрібно обробити цитовані аргументи, див. Редагування нижче):
if [%~1]==[] goto :blank
Чому? ви можете запитати. Ну, так, як згадував Єремія Вілкок: http://ss64.com/nt/if.html - вони використовують це! Гаразд, але що не так з цитатами?
Знову коротка відповідь: вони "магічні" - іноді подвійні (подвійні) лапки перетворюються на одну (подвійну) цитату. І їм потрібно для початку відповідати.
Розглянемо цей маленький сценарій:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
Давайте перевіримо:
C:\> argq bla bla
bla
bla
Done.
Здається, працює. Але тепер давайте перейдемо на другу передачу:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Бум Це не оцінювало як істинне, а також не оцінювало хибне. Сценарій DIED. Якщо ви повинні були вимкнути реактор десь вниз по лінії, добре - удача. Тепер ти помреш, як Гаррі Дагліан.
Ви можете подумати - Гаразд, аргументи не можуть містити лапок. Якщо вони це роблять, це відбувається. Неправильно Ось якесь втіху:
C:\> argq ""bla bla""
""bla
bla""
Done.
О так. Не хвилюйтеся - іноді це буде працювати.
Спробуємо інший сценарій:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
Ви можете перевірити себе, що це працює нормально для вищезазначених випадків. Це логічно - котирування не мають нічого спільного з дужками, тому тут немає ніякої магії. А як же приправити аргументи дужками?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
Не щастить там. Дужки просто не можуть задушити cmd.exe
парсер.
Повернемось на мить до злих цитат. Проблема була там, коли аргумент закінчувався цитатою:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
Що робити, якщо я проходжу просто:
D:\>argq bla2"
The syntax of the command is incorrect.
Сценарій не працюватиме взагалі. Те саме args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
Але що я отримую, коли кількість "
-символів "відповідає" (тобто - парне), в такому випадку:
D:\>args bla2" "bla3
bla2" "bla3
Done.
NICE - Сподіваюся, ви дізналися щось про те, як.bat
файли розділяють аргументи командного рядка (Підказка: * Це не зовсім так, як у bash). Вищенаведений аргумент містить пробіл. Але котирування не знімаються автоматично.
І argq? Як він реагує на це? Передбачувано:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
Так що - подумайте, перш ніж сказати: "Знайте, що? Просто використовуйте цитати. [Тому що, на мене, це виглядає приємніше]".
Редагувати
Нещодавно з’явились коментарі щодо цієї відповіді - ну, дужки sqare "не можуть впоратися", передаючи цитовані аргументи і трактують їх так, як ніби їх не цитують.
Синтаксис:
if "%~1"=="" (...)
Це не якась нещодавно знайдена чеснота подвійних лапок, а відображення акуратної функції зняття лапок із змінної аргументу, якщо перший і останній символ є подвійною цитатою.
Ця "технологія" добре працює з квадратними дужками:
if [%~1]==[] (...)
Це було корисно вказати на це, тому я також схвалюю нову відповідь.
Нарешті, шанувальники подвійних цитат, чи існує аргумент форми ""
у вашій книзі, чи вона порожня? Просто запитую;)
GOTO BLANK
рядку) до двох іншихIF
висловлювань, чи це вирішує проблему?