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

Предложения по определению параметров командной строки

В моем приложении Delphi я хотел бы добавить параметры командной строки, чтобы автоматически устанавливать некоторые параметры на экране входа в систему.

В настоящее время у меня есть экран входа в систему, где пользователь устанавливает некоторую информацию (например, сервер, базу данных, пользователя, пароль, AuthenticationType, AUtoLogin,...).

Я использую MRU для заполнения полей. В любом случае, в крупных организациях есть необходимость не позволять пользователю выбирать какую-либо информацию. Для этого самой простой вещью, которую я могу сделать в своем сценарии, является использование параметров командной строки.

Мой вопрос: как вы предлагаете выбрать параметры командной строки? Я имею в виду, следует ли мне искать подход "позиция" или для какого-то "тега", например:

MyProject.exe -s:MYSERVER -d:DATABASE

или

MyProject.exe MYSERVER DATABASE

В первом случае мне нужно перебрать все параметры с помощью ParamStr и "декодировать" то, что они есть. Если они начинаются с "-s:", я знаю, что следующим является имя сервера. Второй - более быстрый и грязный, но может быть более эффективным.

Как управлять параметрами, содержащими "пространство"? Можно ли автоматически перехватить их с помощью ParamStr или я должен обрабатывать все вручную? (Я имею в виду, есть ли способ автоматически передать ParamStr, что параметр содержит пробел (например, использование фигурных скобок или что-то еще).

Какова наилучшая практика?

4b9b3361

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