Как проверить параметр командной строки в файле ".bat"?
Моя ОС - Windows Vista. Мне нужно иметь файл ".bat", где мне нужно проверить, не вводит ли пользователь какой-либо параметр командной строки или нет. Если это так, если параметр равен -b
, тогда я сделаю что-то, иначе я поставлю флажок "Недопустимый вход". Если пользователь не вводит какой-либо параметр командной строки, я сделаю что-нибудь. Я создал следующий .bat файл. Он работает для -b
и не равен случаям -b
, но он терпит неудачу, когда пользователь не передает какой-либо параметр командной строки.
Я всегда получаю ошибку:
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!
Ответы
Ответ 1
Вам нужно проверить, что параметр пуст: if "%~1"=="" goto blank
Как только вы это сделаете, выполните команду if/else на -b: if "%~1"=="-b" (goto specific) else goto unknown
Окружение параметров кавычками упрощает проверку таких вещей, как пустые/пустые/отсутствующие параметры. "~" гарантирует, что двойные кавычки будут разделены, если они были в аргументе командной строки.
Ответ 2
Посмотрите http://ss64.com/nt/if.html ответ; команда IF [%1]==[] GOTO NO_ARGUMENT
или аналогичная.
Ответ 3
В дополнение к другим ответам, которые я подписываю, вы можете использовать переключатель /I
команды IF
.
... переключатель /I, если указано, говорит, что строка, не учитывающая регистр, сравнивается.
это может помочь, если вы хотите предоставить пользователю нечувствительную к пользователю гибкость, чтобы указать параметры.
IF /I "%1"=="-b" GOTO SPECIFIC
Ответ 4
Вы сравниваете строки. Если аргументы опущены, %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
Ответ 5
Короткий ответ - используйте квадратные скобки:
if [%1]==[] goto :blank
или (когда вам нужно обрабатывать цитируемые аргументы, см. раздел "Изменить" ниже):
if [%~1]==[] goto :blank
Почему? вы можете спросить. Ну, как сказал Иеремия Уиллкок: http://ss64.com/nt/if.html - они это используют! Хорошо, но что не так с цитатами?
Опять же, короткий ответ: они "волшебные" - иногда двойные (двойные) кавычки преобразуются в одну (двойную) цитату. И они должны совпадать, для начала.
Рассмотрим этот маленький script:
@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. Это не оценивалось как true, и не оценивалось значение false. script УМЕР. Если бы вы должны были выключить реактор где-то по линии, хорошо - тяжелая удача. Теперь вы умрете, как Гарри Даглян.
Вы можете подумать - ОК, аргументы не могут содержать кавычки. Если они это сделают, это произойдет. Неверно Вот некоторые утешения:
C:\> argq ""bla bla""
""bla
bla""
Done.
О да. Не беспокойтесь - иногда это будет работать.
Попробуйте еще один script:
@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.
script не будет запускаться вообще. То же самое для args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
Но что я получу, когда число "
-characters "соответствует" (т.е. - четное), в таком случае:
D:\>args bla2" "bla3
bla2" "bla3
Done.
NICE. Надеюсь, вы узнали что-то о том, как файлы .bat
разбивают свои аргументы командной строки (HINT: * Это не совсем так, как в bash). Вышеприведенный аргумент содержит пробел. Но цитаты не удаляются автоматически.
И argq? Как он реагирует на это? Как и следовало ожидать:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
Итак, подумайте, прежде чем сказать: "Знайте, что? Просто используйте цитаты. [Потому что для меня это выглядит лучше".
Edit
Недавно были комментарии об этом ответе - ну, квадратные скобки "не могут обрабатывать" передачу цитируемых аргументов и обработку их так же, как если бы они не цитировались.
Синтаксис:
if "%~1"=="" (...)
Не какая-то вновь найденная добродетель двойных кавычек, а отображение аккуратной функции снятия цитат из переменной аргумента, если первый и последний символы являются двойной цитатой.
Эта "технология" работает также с квадратными скобками:
if [%~1]==[] (...)
Было полезно указать это, поэтому я также выдвигаю новый ответ.
Наконец, поклонники двойной кавычки, есть ли аргумент формы ""
в вашей книге, или он пуст? Просто спрашивайте;)
Ответ 6
Собственно, все остальные ответы имеют недостатки. Самый надежный способ:
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)