2012-02-27 42 views
17

在我的Delphi應用程序中,我想添加命令行參數來自動設置登錄屏幕中的一些參數。關於如何定義命令行參數的建議

目前我有一個登錄屏幕,用戶設置一些信息(如服務器,數據庫,用戶,密碼,AuthenticationType,AUtoLogin,...)。

我使用MRU填充字段。無論如何,在大型組織中,有必要不要讓用戶選擇任何信息。爲此,我可以在我的場景中完成的最簡單的事情就是使用命令行參數。

我的問題是你如何建議選擇命令行參數?我的意思是,我應該去一個「位置」的做法或者一些「標籤」的做法,例如:

MyProject.exe -s:MYSERVER -d:DATABASE 

MyProject.exe MYSERVER DATABASE 

在第一種情況下,我使用需要跨所有參數循環ParamStr和「解碼」它們是什麼。如果他們以「-s」開頭:「我知道接下來是服務器名稱。第二個更快更骯髒,但可能更有效。

如何管理包含「空間」的參數?是否有可能使用ParamStr自動攔截它們,還是應該手動處理所有內容? (我的意思是有沒有辦法自動告訴ParamStr這一個參數包含空格(如使用大括號或東西)。

什麼是最好的做法是什麼?

+6

使用雙引號將包含空格的參數括起來。 – 2012-02-27 11:56:28

+0

我不知道爲什麼我嘗試了所有的組合,但沒有用雙引號!謝謝。我注意到一件有趣的事情。如果我寫:「-s:服務器名稱」和-s:「服務器名稱」,它們在ParamStr中被認爲是相同的。這非常好,因爲編寫「-s:Server Name」不像用戶友好的-s:「服務器名稱」。 – LaBracca 2012-02-27 12:03:59

+0

第一種方法對您和最終用戶來說更方便,更方便。爲了「解碼」參數,你可以使用'TStringList'(每行開始處帶有'-'符號),並使用'Values'屬性和'NameValueSeparator'設置爲':' – teran 2012-02-27 12:07:42

回答

23

我應該走了「位置「方法或」標記「方法?

毫無疑問,您應該標記命令行參數。位置方法不允許有足夠的靈活性來省略參數。標記使用戶更容易理解參數特別是在返回到以前編寫的代碼時。標記應該是自我記錄的。

一個常見的情況是,如果您有一個文件名或一個文件名列表,您將有無標記的參數。

如何管理包含「空格」的參數?

Windows慣例是通過在參數周圍放置雙引號來避免空格。 ParamStr解析將識別這些並相應地解析參數。您在ParamStr(i)中看到的內容是刪除引號後的參數。


RTL帶有一個有用的幫助函數來幫助您的命令行參數解析:FindCmdLineSwitch

+0

謝謝。另請參閱我上面的評論。 – LaBracca 2012-02-27 12:05:16

+0

哇,感謝FindCmdLineSwitch。我總是手動編碼。 – LaBracca 2012-02-27 12:08:23

+2

@ user193655,IMO,'FindCmdLineSwitch'是你的假朋友。它帶來了方便的糖和簡單的開關,但使完全成熟的CLI真正頭痛。考慮:'prog -x -r src dest'。而你關於「更好」語法的問題沒有意義。問問你的高級用戶,他們發現哪個CLI方便。 – OnTheFly 2012-02-27 12:42:14

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 2012-02-27 12:06:33

0

我分隔參數(基於順序)和選項(基於交換機的) 見例如「c:> help copy」。

11

德爾福包含一個非常好的單位稱爲CommandParser與TCommandParser類,爲您做命令行解析。
既然它有virtually no documentation,這裏有一些事情要開始。

我有一個HiddenExecutable example在我們的open source bo repository

基本上你:

  • 設置一個TComponent包含要公開作爲命令行參數(即在HiddenExecuteSettingsUnit
  • 一個命令行解析器控制器THiddenExecuteSettings在我們的例子THiddenExecuteArgumentsTHiddenExecuteArgumentsUnit屬性(回想起來不是這樣一個好名字),它包含一個設置TCommandParser實例的方法
  • 然後執行一個AddSwitch個電話設置有兩個縮寫和全命令行開關(如hhelp
  • 然後,您可以調用ProcessCommandLine方法上TCommandParser實例來處理命令行,並填寫您的TComponent的屬性(在我的例子中的參數,這在ProcessCommandLine方法中完成)。

現在到了有趣:

  • TCommandParserHelpText方法是完全自動組裝根據你喂什麼它與AddSwitch方法幫助文件。
  • TCommandParser也有一個SaveOptions方法,允許您將TComponent的當前設置保存到設置文件中。

你需要的德爾福單位是這些,你可以從英巴卡迪諾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', 

編輯:John Kaster寫了一個不錯article on EDN包括more details on using the TCommandParser

+0

太糟糕了,我無法在德爾福XE7任何地方找到這個單位或其演示:( – 2015-03-08 23:48:30

+1

@JerryDodge你是對的;最後一個版本是XE6,在XE7中它們刪除了所有的dbExpress演示,但它仍然可以在http://sourceforge.net/p/radstudiodemos/code/HEAD/tree/branches/RadStudio_XE6/Object %20Pascal /數據庫/的dbExpress/utils的/ CommandParser.pas – 2015-03-09 08:19:00