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

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)