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

18

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

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

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

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

MyProject.exe -s:MYSERVER -d:DATABASE

или

MyProject.exe MYSERVER DATABASE

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

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

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

    
задан LaBracca 27.02.2012 в 12:54
источник
  • Вы используете двойные кавычки, чтобы заключить параметр, содержащий пробелы. –  Andreas Rejbrand 27.02.2012 в 12:56
  • Я не знаю, почему я попытался со всеми комбинациями, но не с двойными кавычками !. Благодарю. Я заметил интересную вещь. Если я пишу: «-s: имя сервера» и -s: «Имя сервера», они считаются одинаковыми из ParamStr. Это очень хорошо, потому что запись «-s: Server Name» не так удобна, как -s: «Имя сервера». –  LaBracca 27.02.2012 в 13:03
  • 1-й подход более удобен и прост для вас и конечных пользователей .. для «декодирования» параметров вы можете использовать TStringList (strip-символы в начале каждой строки) и использовать его Valuesproperty с NameValueSeparator, установленным на: –  teran 27.02.2012 в 13:07
  • Я считаю, что если требуется аргумент, он должен быть «позиционным». Если это необязательно, тогда оно должно быть «помечено». –  Nat 27.02.2012 в 13:24
  • @Nat Недостаток аргументов позиции заключается в том, что они трудно анализировать человеческий читатель. Конечно, это понятно компьютеру, но думать о бедном человеке! Позиционные аргументы также могут сделать реорганизацию командной строки более сложной. –  David Heffernan 27.02.2012 в 13:35

4 ответа

23
  

Должен ли я использовать подход «позиция» или для какого-то «тега»?

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

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

  

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

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

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

ответ дан David Heffernan 27.02.2012 в 13:03
источник
  • Спасибо. См. Также мой комментарий выше. –  LaBracca 27.02.2012 в 13:05
  • Ничего себе, спасибо за FindCmdLineSwitch. Я всегда кодировал все это вручную. –  LaBracca 27.02.2012 в 13:08
  • @ user193655, IMO, FindCmdLineSwitch - ваш неверный друг. Он приносит удобный сахар с помощью простых переключателей, но делает полноценную CLI настоящей головной болью. Рассмотрим: prog -x -r src dest. И ваш Q о «лучшем» синтаксисе мало смысла. Вместо этого спросите своих опытных пользователей, какой CLI они находят удобными. –  OnTheFly 27.02.2012 в 13:42
  • Я согласен с этим. Чтобы иметь возможность обрабатывать такие аргументы, и это «общий сценарий», описанный в моем ответе, вы действительно хотите, чтобы парсер аргументов, чтобы съесть switch / options и оставить вас с остальными аргументами. –  David Heffernan 27.02.2012 в 13:55
11

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

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

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

  • настройте 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',

Изменить: Джон Кастер написал приятный article on EDN , который включает более подробную информацию об использовании TCommandParser .     

ответ дан Jeroen Wiert Pluimers 27.02.2012 в 19:38
источник
  • Слишком плохо, я не могу найти это устройство где-нибудь в Delphi XE7 или его демо :( –  Jerry Dodge 09.03.2015 в 00:48
  • @JerryDodge вы правы; последней версией, поставляемой в примерах, была XE6. В XE7 они удалили все демонстрации dbExpress, но они все еще находятся в режиме on-line на sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/... –  Jeroen Wiert Pluimers 09.03.2015 в 09:19
7

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

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
    
ответ дан Andreas Rejbrand 27.02.2012 в 13:05
источник
  • Да, интересная вещь заключается в том, что она работает и красиво использует: один два "с пробелами" три четыре "с пробелами" –  LaBracca 27.02.2012 в 13:06
0

Я бы разделил аргументы (на основе заказа) и параметры (на основе коммутатора) Например, см. «C: & gt; help copy».

    
ответ дан Lars Fosdal 27.02.2012 в 15:32
источник