2012-02-27 5 views
17

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

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

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

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

MyProject.exe -s:MYSERVER -d:DATABASE 

или

MyProject.exe MYSERVER DATABASE 

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

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

Что является лучшей практикой?

+6

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

+0

Я не знаю, почему я пробовал все комбинации, но не с двойными кавычками !. Благодарю. Я заметил интересную вещь. Если я пишу: «-s: имя сервера» и -s: «Имя сервера», они считаются одинаковыми из ParamStr. Это очень хорошо, потому что запись «-s: Server Name» не так удобна, как -s: «Имя сервера». – LaBracca

+0

1-й подход более удобен и прост для вас и конечных пользователей.для «декодирования» параметров вы можете использовать 'TStringList' (разделите символы' '' в начале каждой строки) и используйте его 'Values'property с' NameValueSeparator', установленным в ':' – teran

ответ

23

Должен ли я идти на " «позиция» или какой-то «тег»?

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

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

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

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


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

+0

Спасибо. См. Также мой комментарий выше. – LaBracca

+0

Ничего себе, спасибо за FindCmdLineSwitch. Я всегда кодировал все это вручную. – LaBracca

+2

@ user193655, IMO, 'FindCmdLineSwitch' - ваш неверный друг. Он приносит удобный сахар с помощью простых переключателей, но делает полноценную CLI настоящей головной болью. Рассмотрим: 'prog -x -r src dest'. И ваш Q о «лучшем» синтаксисе мало смысла. Вместо этого спросите своих опытных пользователей, какой CLI они находят удобными. – OnTheFly

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 
+0

Да, интересно то, что он работает и красиво использует: один два «с пробелами» три четыре «с пробелами» – LaBracca

0

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

11

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

У меня есть HiddenExecutable example на нашем open source bo repository.

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

  • настроить TComponent, который содержит свойства, которые вы хотите, чтобы выставить в качестве параметров командной строки (то есть в HiddenExecuteSettingsUnit
  • контроллер с командной строки синтаксического анализатора THiddenExecuteSettings В нашем случае 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', 

Edit:John Kaster написал хороший article on EDN, который включает в себя more details on using the TCommandParser.

+0

Жаль, что я не могу найти это устройство нигде в Delphi XE7 или его демо :( –

+1

@JerryDodge вы правы; последней версией, которую он отправил в примерах, был XE6. В XE7 они удалили все демонстрации dbExpress, но он по-прежнему находится в режиме онлайн по адресу http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE6/Object % 20Pascal/База данных/DBEXPRESS/Utils/CommandParser.pas –

Смежные вопросы