Краткий ответ - используйте квадратные скобки:
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.
Стрела Это не оценивалось как истинное, равно как и ложное.Сценарий Умер.Если вы должны были выключить реактор где-то вниз по линии, ну, вам не повезло.Теперь вы умрете, как Гарри Даглиан.
Вы можете подумать - ОК, аргументы не могут содержать кавычек.Если они это сделают, это произойдет. Неправильно Вот несколько утешений:
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.
Итак, подумайте, прежде чем сказать: «Знаете что? Просто используйте кавычки. [Потому что, мне кажется, это выглядит лучше]».
Редактировать
В последнее время появились комментарии об этом ответе - ну, квадратные скобки «не могут обработать» передачу аргументов в кавычках и их обработку так же, как если бы они не были заключены в кавычки.
Синтаксис:
if "%~1"=="" (...)
Не является недавно обнаруженным достоинством двойных кавычек, а отображает аккуратную особенность удаления кавычек из переменной аргумента, если первый и последний символ - двойная кавычка.
Эта «технология» работает так же хорошо с квадратными скобками:
if [%~1]==[] (...)
Было полезно указать на это, поэтому я также приветствую новый ответ.
Наконец, дваждыцитируйте фанатов, существует ли в вашей книге аргумент вида ""
или он пустой?Просто спрашиваешь;)