Подтвердить что ты не робот

Как проверить параметр командной строки в файле ".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!
4b9b3361

Ответ 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)