Моя ОС - 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!
windows
file
batch-file
cmd
javauser71
источник
источник
GOTO BLANK
строку) к двум другимIF
операторам, решит ли это проблему?Ответы:
Вам нужно проверить, не заполнен ли параметр:
if "%~1"=="" goto blank
Как только вы это сделаете, включите if / else -b:
if "%~1"=="-b" (goto specific) else goto unknown
Заключение параметров в кавычки упрощает проверку таких вещей, как пустые / пустые / отсутствующие параметры. «~» гарантирует удаление двойных кавычек, если они были в аргументе командной строки.
источник
File
, в этом случае вы должны проверять толькоexist
илиnot exist
. Вот почему ваши аргументы должны быть четко определены, или просто используйте powershell или vbScript (если вы находитесь в 80-х ...)run.bat "a b"
."%1"==""
вылетает, если в аргументе есть пробел. См stackoverflow.com/a/46942471Посмотрите http://ss64.com/nt/if.html для ответа; команда такая
IF [%1]==[] GOTO NO_ARGUMENT
или похожая.источник
"%1"==""
. Я должен уточнить это в своем собственном ответе.foo.bat "1st parameter" 2nd_param
. См stackoverflow.com/questions/2541767/...[%1]==[-b]
не будет соответствовать, если аргумент заключен в кавычки. Примерrun.bat "-b"
. См stackoverflow.com/a/46942471Короткий ответ - используйте квадратные скобки:
или (если вам нужно обработать аргументы в кавычках, см. Правка ниже):
Зачем? вы можете спросить. Ну, как сказал Джереми Уиллкок: http://ss64.com/nt/if.html - они это используют! Хорошо, а что не так с цитатами?
И снова короткий ответ: они «волшебные» - иногда двойные (двойные) кавычки преобразуются в одинарные (двойные) кавычки. И для начала они должны совпадать.
Рассмотрим этот небольшой сценарий:
Давайте протестируем это:
Кажется, работает. А теперь перейдем на вторую передачу:
Boom This не оценивается как истина, ни как не оценивается как ложь. Сценарий УМЕР. Если вы должны были выключить реактор где-нибудь в будущем, ну - не повезло. Теперь ты умрешь, как Гарри Даглиан.
Вы можете подумать - хорошо, аргументы не могут содержать кавычек. Если они это сделают, это произойдет. Неправильно Вот какое утешение:
О да. Не волнуйтесь - иногда это будет работать.
Попробуем другой сценарий:
Вы можете проверить себя, что он работает нормально для вышеуказанных случаев. Это логично - кавычки не имеют отношения к скобкам, так что никакой магии здесь нет. Но как насчет того, чтобы приправить аргументы скобками?
Не повезло. Скобки просто не могут заглушить
cmd.exe
парсер.Вернемся на минутку к злым цитатам. Проблема была там, когда спор закончился цитатой:
Что, если я пройду только:
Скрипт вообще не запускается. То же самое для
args.bat
:Но что я получаю, когда количество
"
-символов "совпадает" (то есть - четно), в таком случае:ПРИЯТНО - Надеюсь, вы узнали кое-что о том, как
.bat
файлы разделяют аргументы командной строки (ПОДСКАЗКА: * Это не совсем так, как в bash). Приведенный выше аргумент содержит пробел. Но кавычки не удаляются автоматически.А argq? Как он на это реагирует? Как и ожидалось:
Так что подумайте, прежде чем говорить: «Знаете что? Просто используйте кавычки. [Потому что, на мой взгляд, это выглядит лучше]».
редактировать
Недавно были комментарии по поводу этого ответа - ну, квадратные скобки «не могут обрабатывать» передачу цитируемых аргументов и обработку их так, как если бы они не цитировались.
Синтаксис:
Это не недавно обнаруженное достоинство двойных кавычек, а отображение изящной функции удаления кавычек из переменной аргумента, если первый и последний символы являются двойными кавычками.
Эта «технология» работает и с квадратными скобками:
Было полезно указать на это, поэтому я также поддержал новый ответ.
Наконец, любители двойных кавычек,
""
существует ли в вашей книге аргумент такой формы или он пустой? Просто спрашиваю;)источник
[%1]==[-b]
не подходят, если аргумент заключен в кавычкиrun.bat "-b"
. См stackoverflow.com/a/46942471[%1]==[-b]
и"%1"=="-b"
были одинаковыми для сценариев пакетной обработки систем Win 98 и более ранних систем MS / PC-DOS. Поскольку в win 2000 / NT появился синтаксис, вif "%~1"=="-b"
котором двойные кавычки имеют особое значение, именно так вы должны кодировать сценарии, поскольку он обеспечивает более надежную защиту. Двойные кавычки лишают смысла специальные символы (попробуйте & | и% chars в командной строке). 99,9% примеров работают с синтаксисом двойных кавычек - ваш примерargq bla2" "bla3
является единственным случаем, чтобы оправдать квадратные скобки. Встроенные двойные кавычки - это рецепт катастрофы - просто скажиcmd
оболочке. В других системах вы можете иногда цитировать все, включая символ NUL. ( stackoverflow.com/questions/2730732/… ) - этот вопрос просто показывает, что вам нужно использовать какую-то внешнюю программу.В дополнение к другим ответам, на которые я подписываюсь, вы можете рассмотреть возможность использования
/I
переключателяIF
команды.это может быть полезно, если вы хотите дать пользователям гибкость при указании параметров без учета регистра.
источник
Вы сравниваете строки. Если аргументы опущены,
%1
расширяется до пустого значения, поэтому команды становятся,IF =="-b" GOTO SPECIFIC
например, (что является синтаксической ошибкой). Заключите строки в кавычки (или квадратные скобки).источник
Собственно, во всех остальных ответах есть недостатки. Самый надежный способ:
Детальное объяснение:
Использование
"%1"=="-b"
приведет к сбою, если передать аргумент с пробелами и кавычками. Это наименее надежный метод.Использование
[%1]==[-b]
лучше, потому что оно не приведет к сбою из-за пробелов и кавычек, но не будет соответствовать, если аргумент заключен в кавычки.Использование
"%~1"=="-b"
- самое надежное.%~1
удалит окружающие кавычки, если они существуют. Таким образом, он работает с кавычками и без них, а также без аргументов.источник
IF [%~1]==[]
- это работает, и даже обрабатывает"-b"
. Вам просто нужно уметь мыслить внутри коробки, эээ… квадратных [скобок].В последнее время я боролся с реализацией сложных переключателей параметров в пакетном файле, поэтому вот результат моего исследования. Ни один из предоставленных ответов не является полностью безопасным, примеры:
"%1"=="-?"
не будет соответствовать, если параметр заключен в кавычки (необходим для имен файлов и т. д.), или будет аварийно завершен, если параметр заключен в кавычки и имеет пробелы (снова часто встречается в именах файлов)Любая комбинация с квадратными скобками
[%1]==[-?]
или[%~1]==[-?]
не удастся, если в параметре есть пробелы в кавычках:Предлагаемое самое безопасное решение
"%~1"=="-?"
приведет к сбою со сложным параметром, который включает текст вне кавычек и текст с пробелами внутри кавычек:Единственный способ обеспечить охват всех вышеупомянутых сценариев - использовать EnableDelayedExpansion и передавать параметры по ссылке (а не по значению) с использованием переменных. Тогда даже самый сложный сценарий будет работать нормально:
источник
В пакете Windows для этого есть ключевое слово DEFINED.
источник