Короткий ответ - используйте квадратные скобки:
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.
Boom This не оценивается как истина, ни как не оценивается как ложь. Сценарий УМЕР. Если вы должны были выключить реактор где-нибудь в будущем, ну - не повезло. Теперь ты умрешь, как Гарри Даглиан.
Вы можете подумать - хорошо, аргументы не могут содержать кавычек. Если они это сделают, это произойдет. Неправильно Вот какое утешение:
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.
ПРИЯТНО - Надеюсь, вы узнали кое-что о том, как .bat
файлы разделяют аргументы командной строки (ПОДСКАЗКА: * Это не совсем так, как в bash). Приведенный выше аргумент содержит пробел. Но кавычки не удаляются автоматически.
А argq? Как он на это реагирует? Как и ожидалось:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
Так что подумайте, прежде чем говорить: «Знаете что? Просто используйте кавычки. [Потому что, на мой взгляд, это выглядит лучше]».
редактировать
Недавно были комментарии по поводу этого ответа - ну, квадратные скобки «не могут обрабатывать» передачу цитируемых аргументов и обработку их так, как если бы они не цитировались.
Синтаксис:
if "%~1"=="" (...)
Это не недавно обнаруженное достоинство двойных кавычек, а отображение изящной функции удаления кавычек из переменной аргумента, если первый и последний символы являются двойными кавычками.
Эта «технология» работает и с квадратными скобками:
if [%~1]==[] (...)
Было полезно указать на это, поэтому я также поддержал новый ответ.
Наконец, любители двойных кавычек, ""
существует ли в вашей книге аргумент такой формы или он пустой? Просто спрашиваю;)
GOTO BLANK
строку) к двум другимIF
операторам, решит ли это проблему?