Предложения по определению параметров командной строки - PullRequest
18 голосов
/ 27 февраля 2012

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

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

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

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

MyProject.exe -s:MYSERVER -d:DATABASE

или

MyProject.exe MYSERVER DATABASE

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

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

Каков наилучший метод?

Ответы [ 4 ]

23 голосов
/ 27 февраля 2012

Должен ли я пойти на "позиционный" подход или какой-нибудь "теговый" подход?

Без сомнения, вы должны пометить аргументы командной строки. Позиционные подходы не позволяют достаточно гибко опускать параметры. Использование тегов облегчает пользователю понимание аргументов, особенно при возврате к ранее написанному коду. Теги должны быть самодокументированными.

Один из распространенных сценариев, когда у вас есть непомеченные аргументы, это когда у вас есть имя файла или список имен файлов.

Как управлять параметрами, которые содержат «пробел»?

Соглашение Windows гласит, что пробелы экранируются двойными кавычками вокруг аргумента. Синтаксический анализатор ParamStr распознает их и соответствующим образом проанализирует аргументы. То, что вы видите в ParamStr(i), является аргументом с удаленными кавычками.


RTL поставляется с полезной вспомогательной функцией, которая помогает в разборе аргументов командной строки: FindCmdLineSwitch.

12 голосов
/ 27 февраля 2012

Delphi содержит действительно хороший модуль под названием CommandParser с классом TCommandParser , который выполняет синтаксический анализ командной строки.
Так как практически не имеет документации , вот несколько вещей, с которых нужно начать.

У меня есть пример HiddenExecutable в нашем репозитории с открытым исходным кодом bo .

В основном вы:

  • устанавливает TComponent, который содержит свойства, которые вы хотите предоставить в качестве параметров командной строки (то есть THiddenExecuteSettings в HiddenExecuteSettingsUnit
  • контроллер парсера командной строки. В нашем случае THiddenExecuteArguments в THiddenExecuteArgumentsUnit (в ретроспективе не очень хорошее имя), который содержит метод InitCommandLine, который устанавливает экземпляр TCommandParser, передавая ему ваш TComponent
  • Затем он выполняет пару вызовов AddSwitch для настройки параметров как с сокращенными, так и с полными параметрами командной строки (например, h и help)
  • Затем можно вызвать метод ProcessCommandLine в экземпляре TCommandParser, чтобы обработать командную строку и заполнить свойства вашего TComponent (в моем примере это делается в методе ProcessCommandLine).

Теперь самое интересное:

  • В TCommandParser есть метод 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 .

7 голосов
/ 27 февраля 2012

Ваш первый вопрос - просто вопрос вкуса. Впрочем, на второй я могу ответить. Вы используете двойные кавычки для заключения параметра, содержащего пробелы. Например, если у вас есть

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
0 голосов
/ 27 февраля 2012

Я бы разделил Аргументы (на основе заказа) и Опции (на основе переключателя). См., Например, «c:> help copy».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...