5

を読むParamStr()と、各パラメーターの間はスペースで区切られます。ただし、パラメーター名とそのペアの値の間にスペースを受け入れる一方で、等号を受け入れ、=区切り記号 (パラメーター名のプレフィックスが付いているだけ) または値を受け入れない多くのコマンドライン引数を見てきました。

可能なパラメータ文字列の例を次に示します。

-name value
/name value
-name=value
/name=value
-namevalue
/namevalue
-name -nextname
/name /nextname
-name="value with spaces"
/name="value with spaces"

...等。

私がやりたいことは、両方が関連している 2 つのことです...パラメーター名が存在するかどうかを確認し、パラメーターの値を読み取ります。例えば...

if ParamExists('ParamName') then
  SomeString:= ParamValue('ParamName')
else
  SomeString:= 'SomeOtherString';

これを行うことができる Delphi の何かがありますか? そうでない場合、どうすればよいですか?これを検索するときに見つけたものはすべて、同じ基本的な例につながります。

for i := 0 to ParamCount do
  ShowMessage(ParamStr(i));

また、大文字と小文字を区別する必要があります。OSQL特に、「-s」が「-S」とは異なる可能性がある場所で使用する類似のコマンドラインツールを探しています。

問題は、区切り記号としてスペースを使用する場合、それが前のパラメーターの一部であることを認識する方法がわからないことです。これは、それらがスペースで分割されるためです。どうすればこれを回避できますか?

これには標準的な用語もあると思いますが、それはコマンドライン引数の一般的なフォーマットです。しかし、単に を使用してそれらを適切に読み取る方法がわかりませんParamStrParamStr通常の使用目的には及ばないようです。

明確にするために、上記のすべての例を必ずしもサポートする必要はありません。これらは、以前に見た例にすぎません。

4

4 に答える 4

5

ParamStr()(そしてその結果FindCmdLineSwitch())あなたが示したすべての例を処理するのに十分なほど柔軟ではありません. Win32 APIGetCommandLine()関数を呼び出して、手動で解析する必要があります。

于 2013-06-15T08:27:56.653 に答える
0

いくつかの価値を追加するために、提案されたすべての回答を書き直しました。コメントに感謝します。

function TForm1.ParamExists(sParamName: String;
  bIgnoreCase: boolean; equalchar : string = '='): Boolean;
begin
  if bIgnoreCase then
    Result := Pos(sParamName + equalChar, cmdLine) > 0
  else
    Result := AnsiPos(sParamName + equalChar, cmdLine) > 0;
end;

function TForm1.ParamValue(sParamName : String; bIgnoreCase : boolean = false;
                           equalchar : string = '='; delimiter : string = '"'): String;
var
  I : Integer;
  scmdLine : String;
begin
  Result := '';
  scmdLine := cmdLine;
  if bIgnoreCase then
    I := Pos(sParamName, scmdLine)
  else
    I := AnsiPos(sParamName, scmdLine);

  inc(I, Length(sParamName + equalchar));

  delete(scmdLine, 1, I-1);
  if pos(delimiter, scmdLine) = 1 then
  begin
    delete(scmdLine, 1, 1);
    Result := copy(scmdLine,1, pos(delimiter, scmdLine) -1);
  end
  else
    Result := copy(scmdLine,1, pos(' ', scmdLine));
end;

このパラメータを仮定すると:

project1.exe -name1 value1 /name2 value2 -name3=value3 /name4=value4 -name5value5 /name6value6 -name7 -name8 /name9 /name91 -name10="Value 10" /name11="Value 11" 

例:

ParamExists('-Name1', False, ' '); --> False
ParamExists('-Name1', True, ' '); --> True, ignore case
ParamExists('-name1', False, ' '); --> True
ParamExists('-name1', False, '='); --> False there are no a = after -name1 parameter
ParamExists('-name6', False, ''); --> True this parameter use the form -parameterValue 

パラメータ値の例:

ParamValue('-name1', false, ' '); --> value1
ParamValue('/name2', false, ' '); --> value2
ParamValue('-name3'); --> value3, using default values
ParamValue('-name4'); --> value4, using default values
ParamValue('-name5', false, ''); --> value5
ParamValue('/name6', false, ''); --> value6

パラメータ -name7、-name8、/name9、および /name91 は、値が割り当てられていないため、ParamExists として評価する必要があることに注意してください。

ParamValue('-name10', false, '=', '"'); --> Value 10
same as:
ParamValue('-name10'); --> Value 10

ParamValue('/name11'); --> Value 11
于 2018-11-29T22:03:00.530 に答える