Как проверить параметр командной строки ".bat файл"?
моя ОС-это Windows Vista. Мне нужно ".bat-файл", где мне нужно проверить, если пользователь вводит любой параметр командной строки или нет. Если делает, то если параметр равен -b
тогда я сделаю что-то иначе я буду отмечать "недопустимый ввод". Если пользователь не вводит какой-либо параметр командной строки, то я сделаю что-то. Я создал следующее .Bat-файл. Это работает для -b
и не-равная -b
cases-но это не удается, когда пользователь не передает никакой командной строки параметр.
Я всегда получаю ошибку:
GOTO was unexpected at this time.
может кто-нибудь сказать мне, что я делаю неправильно здесь?
ECHO OFF
CLS
ECHO.
IF [%1]==[/?] GOTO BLANK
IF %1=="-b" GOTO SPECIFIC
IF NOT %1=="-b" GOTO UNKNOWN
:SPECIFIC
ECHO SPECIFIC
GOTO DONE
:BLANK
ECHO No Parameter
GOTO DONE
:UNKNOWN
ECHO Unknown Option
GOTO DONE
:DONE
ECHO Done!
6 ответов:
вы должны проверить, что параметр пуст:
if "%~1"=="" goto blank
после того, как вы сделали это, а затем сделать if/else включите-b:
if "%~1"=="-b" (goto specific) else goto unknown
окружение параметров кавычками упрощает проверку таких вещей, как пустые/пустые/отсутствующие параметры. "~"гарантирует, что двойные кавычки будут удалены, если они были в аргументе командной строки.
посмотрите на http://ss64.com/nt/if.html для ответа; команда
IF [%1]==[] GOTO NO_ARGUMENT
или аналогичные.
короткий ответ-используйте квадратные скобки:
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.
вы можете проверить себя, что он работает нормально для этих случаев. Это логично-кавычки не имеют никакого отношения к скобкам, поэтому здесь нет никакой магии. Но как насчет того, чтобы приправить args скобки?
D:\>args ]bla bla[ ]bla bla[ Done. D:\>args [bla bla] [bla bla] Done.
не повезло там. Скобки просто не могут задохнуться 'ы.
давайте вернемся к злым цитатам на мгновение. Проблема была там, когда аргумент закончился цитатой:
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.
Edit
синтаксис:
if "%~1"=="" (...)
это не какая-то вновь найденная добродетель двойных кавычек, а отображение аккуратной функции удаления кавычек из переменной аргумента, если первый и последний символ является двойным цитата.
эта "технология" работает так же хорошо в квадратные скобки:
if [%~1]==[] (...)
это было полезно, чтобы указать на это, поэтому я также выдвигаю новый ответ.
наконец, поклонники двойной кавычки, делает аргумент формы
""
существуют в вашей книге, или она пуста? Просто спрашиваю ;)
В дополнение к другим ответы, которые я подписываюсь, вы можете использовать
/I
переключатель .... переключатель /I, если он указан, говорит, что делает сравнение строк без учета регистра.
это может быть полезно, если вы хотите, чтобы дать нечувствительный к регистру гибкость для ваших пользователей, чтобы указать параметры.
IF /I "%1"=="-b" GOTO SPECIFIC
вы сравниваете строки. Если аргумент опущен,
%1
расширяется до пустого, поэтому команды становятсяIF =="-b" GOTO SPECIFIC
например (что является синтаксической ошибкой). Заключите строки в кавычки (или квадратные скобки).REM this is ok IF [%1]==[/?] GOTO BLANK REM I'd recommend using quotes exclusively IF "%1"=="-b" GOTO SPECIFIC IF NOT "%1"=="-b" GOTO UNKNOWN
на самом деле, все остальные ответы есть недостатки. Самый надежный способ-это:
IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN)
Подробное Описание:
используя
"%1"=="-b"
будет плоский сбой, если передать аргумент с пробелами и кавычками. Это наименее надежный метод.IF "%1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) C:\> run.bat "a b" b""=="-b" was unexpected at this time.
используя
[%1]==[-b]
лучше, потому что он не будет разбиваться с пробелами и кавычками, но он не будет соответствовать, если аргумент окружен кавычками.IF [%1]==[-b] (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) C:\> run.bat "-b" (does not match, and jumps to UNKNOWN instead of SPECIFIC)
используя
"%~1"=="-b"
- самый надежный.%~1
будет снять кавычки, если они существуют. Таким образом, он работает с кавычками и без них, а также без каких-либо аргументов.IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) C:\> run.bat C:\> run.bat -b C:\> run.bat "-b" C:\> run.bat "a b" (all of the above tests work correctly)