Предложения по определению параметров командной строки
В моем приложении Delphi я хотел бы добавить параметры командной строки, чтобы автоматически устанавливать некоторые параметры на экране входа в систему.
В настоящее время у меня есть экран входа в систему, где пользователь устанавливает некоторую информацию (например, сервер, базу данных, пользователя, пароль, AuthenticationType, AUtoLogin,...).
Я использую MRU для заполнения полей. В любом случае, в крупных организациях есть необходимость не позволять пользователю выбирать какую-либо информацию. Для этого самой простой вещью, которую я могу сделать в своем сценарии, является использование параметров командной строки.
Мой вопрос: как вы предлагаете выбрать параметры командной строки? Я имею в виду, следует ли мне искать подход "позиция" или для какого-то "тега", например:
MyProject.exe -s:MYSERVER -d:DATABASE
или
MyProject.exe MYSERVER DATABASE
В первом случае мне нужно перебрать все параметры с помощью ParamStr
и "декодировать" то, что они есть. Если они начинаются с "-s:", я знаю, что следующим является имя сервера. Второй - более быстрый и грязный, но может быть более эффективным.
Как управлять параметрами, содержащими "пространство"? Можно ли автоматически перехватить их с помощью ParamStr или я должен обрабатывать все вручную? (Я имею в виду, есть ли способ автоматически передать ParamStr, что параметр содержит пробел (например, использование фигурных скобок или что-то еще).
Какова наилучшая практика?
Ответы
Ответ 1
Должен ли я использовать подход "позиция" или для какого-то "тега"?
Без сомнения, вы должны пометить свои аргументы командной строки. Позиционные подходы не позволяют обеспечить достаточную гибкость для опускания параметров. Маркировка облегчает пользователю понимание аргументов, особенно при возврате к ранее написанному коду. Теги должны быть самодокументированы.
Один из распространенных сценариев, когда у вас есть непомеченные аргументы, - это когда у вас есть имя файла или список имен файлов.
Как управлять параметрами, содержащими "пространство"?
Соглашение Windows состоит в том, что пробелы экранируются путем размещения двойных кавычек вокруг аргумента. Разбор ParamStr
будет распознавать их и соответствующим образом анализировать аргументы. То, что вы видите в ParamStr(i)
, - это аргумент с удаленными кавычками.
RTL поставляется с полезной вспомогательной функцией, помогающей разбору аргументов командной строки: FindCmdLineSwitch
.
Ответ 2
Delphi содержит действительно хороший блок под названием CommandParser с классом TCommandParser, который выполняет синтаксический анализ командной строки для вас.
Поскольку практически нет документации, вот несколько вещей, которые нужно начать.
У меня есть пример HiddenExecutable в нашем репозитории open source bo.
В основном вы:
- настройте a
TComponent
, который содержит свойства, которые вы хотите отображать как параметры командной строки (то есть THiddenExecuteSettings
в HiddenExecuteSettingsUnit
- контроллер парсера командной строки. В нашем случае
THiddenExecuteArguments
в THiddenExecuteArgumentsUnit (в ретроспективе не такое хорошее имя), которое содержит метод InitCommandLine
, который устанавливает TCommandParser экземпляр, передающий его TComponent
- Затем он выполняет пару AddSwitch вызовов для настройки параметров с использованием как сокращенных, так и полных команд командной строки (например,
h
и help
)
- Затем вы можете вызвать метод
ProcessCommandLine
в экземпляре TCommandParser
для обработки командной строки и заполнения свойств вашего TComponent
(в моем примере это выполняется в методе ProcessCommandLine
).
Теперь придет удовольствие:
-
TCommandParser
имеет метод HelpText
, который полностью автоматически собирает helptext, основываясь на том, что вы его накормили методами AddSwitch
.
-
TCommandParser
также имеет метод SaveOptions
, который позволяет сохранять текущие настройки вашего TComponent в файл настроек.
Вам нужны единицы Delphi, которые вы можете получить из демонстрационного репозитория Embarcadero radstudiodemos.sourceforge.net:
CommandParser in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\Utils\CommandParser.pas',
PropertyHelpers in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\DbxDataPump\PropertyHelpers.pas',
ParseIds in '...\radstudiodemos.sourceforge.net\branches\RadStudio_XE2\Delphi\Database\dbExpress\DbxDataPump\ParseIds.pas',
Изменить: Джон Кастер написал хорошую статью в статье EDN, который включает более подробную информацию об использовании TCommandParser.
Ответ 3
Ваш первый вопрос - это просто вопрос вкуса. Тем не менее, второй, на который я могу ответить. Вы используете двойные кавычки, чтобы заключить параметр, содержащий пробелы. Например, если у вас есть
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
i: integer;
begin
for i := 0 to ParamCount do
WriteLn(ParamStr(i));
Readln;
end.
и запустите приложение с помощью аргументов one "two with spaces" three "four with spaces"
, затем вы получите вывод
C:\Users\Andreas Rejbrand\Documents\RAD Studio\Projects\Project1.exe
one
two with spaces
three
four with spaces
Ответ 4
Я бы разделил аргументы (на основе заказа) и параметры (на основе коммутатора)
Например, см. "C: > help copy".