Мне нужен мой файл bat, чтобы принимать несколько необязательных именованных аргументов.
mycmd.bat man1 man2 -username alice -otheroption
Например, моя команда имеет 2 обязательных параметра и два необязательных параметра (-username) со значением аргумента alice и -otheroption:
Я хотел бы иметь возможность преобразовать эти значения в переменные.
Просто позвоните всем, кто уже решил эту проблему. Эти файлы летучей мыши - это боль.
batch-file
курицапеченье
источник
источник
http://web.archive.org/web/20090403050231/http://www.pcguide.com/vb/showthread.php?t=52323
.Ответы:
Хотя я склонен согласиться с комментарием @AlekDavis , тем не менее есть несколько способов сделать это в оболочке NT.
Подход, который я бы использовал с помощью команды SHIFT и условного ветвления IF , что-то вроде этого ...
источник
SHIFT /2
сдвигается, начиная с аргумента 2. Он не сдвигается два раза. Разве его нельзя заменить наSHIFT & SHIFT
?mycmd.bat -username anyvalue -username myName -otheroption othervalue
. Результатом должно быть user = myName, other = othervalue; но код дает user = -username, other = othervalue. Ошибка исправляется заменойSHIFT /2
наSHIFT & SHIFT
.;
- его нельзя использовать вместо&
.%1
и%2
были «Использованы». b) Одиночное значениеSHIFT
в строке 11 перемещает значение%2
на 1 позицию вниз и затем становится доступным (снова) как%1
, а значение «Неиспользовано»%3
доступно как%2
. c) ВIF
строке 13 отображается это уже «Используемое» значение, из%2
которого сейчас находится%1
. d) Если «имя пользователя» из строки 10 выглядит так"-otheroption"
, оно будет использовано снова иother
будет установлено на новое значение в%2
, которое, вероятно, было именем следующей опции. --->-otheroption
не следовало значение, поэтому оно, вероятно, подразумевалось как-Flag
параметр типа и не должно использовать второй аргумент. 3-й: если аргумент%1
не обрабатывается внутреннимиIF
операторами, он игнорируется. Код, вероятно, должен отображать сообщение о том, что это недопустимый вариант. Это может быть сделано путем добавления требуемогоSHIFT
иGOTO :loop
заявление во внутренниеIF
заявления, либо путем добавленияELSE
заявления.Выбранный ответ работает, но его можно улучшить.
Мое решение основано на создании переменной OPTIONS, которая определяет все параметры и их значения по умолчанию. OPTIONS также используется для проверки допустимости предоставленной опции. Огромный объем кода сохраняется, просто сохраняя значения параметров в переменных, названных так же, как параметр. Объем кода постоянен независимо от того, сколько опций определено; только определение OPTIONS должно измениться.
РЕДАКТИРОВАТЬ - Кроме того, код цикла: должен измениться, если количество обязательных позиционных аргументов изменится. Например, часто все аргументы имеют имена, и в этом случае вы хотите проанализировать аргументы, начинающиеся с позиции 1, а не 3. Итак, в цикле: все 3 становятся 1, а 4 становится 2.
На самом деле кода не так уж и много. Большая часть приведенного выше кода - это комментарии. Вот тот же код без комментариев.
Это решение предоставляет аргументы стиля Unix в пакете Windows. Это не является нормой для Windows - пакетная программа обычно имеет параметры, предшествующие требуемым аргументам, а параметры имеют префикс
/
.Методы, используемые в этом решении, легко адаптируются к стилю опций Windows.
%1
и продолжается до тех пор, пока аргумент 1 не начнется с/
/
.SET /VAR=VALUE
неSET "/VAR=VALUE"
работает. В любом случае я уже делаю это в своем решении./
. Это ограничение может быть устранено путем использования неявно определенной//
опции, которая служит сигналом для выхода из цикла анализа опции. Для//
"опции" ничего не будет сохранено .Обновление 2015-12-28: поддержка
!
значений параметров inВ приведенном выше коде каждый аргумент раскрывается при включенном отложенном раскрытии, что означает, что
!
они, скорее всего, удаляются или!var!
расширяются что-то подобное . Кроме того,^
может быть удален, если!
присутствует. Следующая небольшая модификация кода без комментариев снимает ограничение, так что!
и^
сохраняются в значениях параметров.источник
Если вы хотите использовать необязательные аргументы, но не именованные аргументы, этот подход сработал для меня. Я думаю, что это гораздо более простой код.
источник
IF "%1"==""
завершится ошибкой, если аргумент сам содержит кавычки. Просто используйте вместо него любой другой неспециальный символ, например ._ = [] # и т. Д.Создание динамических переменных
Плюсы
%1
,%2
...%*
в такт/arg
и для-arg
стиляМинусы
setlocal
для локального определения области видимости или напишите сопутствующую:CLEAR-ARGS
процедуру!--force
в-f
)""
поддержки пустых аргументовПрименение
Вот пример того, как следующие аргументы относятся к переменным .bat:
Реализация
источник
:ARG-PARSER
подпрограммы во внешний файл .bat,arg-parser.bat
чтобы сделать его доступным и для других сценариев.Однажды я написал программу, обрабатывающую короткие (-h), длинные (--help) и неопциональные аргументы в пакетном файле. Эти методы включают:
аргументы без параметров, за которыми следуют аргументы параметров.
оператор сдвига для тех опций, у которых нет аргумента, такого как '--help'.
два оператора временного сдвига для тех опций, которые требуют аргумента.
пройти через метку для обработки всех аргументов командной строки.
Выйдите из скрипта и остановите обработку тех параметров, которые не требуют дополнительных действий, таких как '--help'.
Написал справочные функции для удобства пользователя
Вот мой код.
источник
Вот парсер аргументов. Вы можете смешивать любые строковые аргументы (оставленные нетронутыми) или экранированные параметры (одиночные или пары параметр / значение). Чтобы проверить это, раскомментируйте последние 2 утверждения и запустите как:
Escape char определяется как
"_SEP_=/"
, при необходимости переопределить.источник