web-dev-qa-db-ja.com

Inno Setupでカスタムコマンドラインパラメーターを受け入れることは可能ですか?

Inno Setupでインストーラーを準備しています。しかし、追加のカスタム(使用可能なパラメーターはありません)コマンドラインパラメーターを追加し、次のようなパラメーターの値を取得したいと考えています。

setup.exe /do something

/doが与えられ、何かの値を取得します。出来ますか?これどうやってするの?

28
Similar

InnoSetup 5.5.5(および他のバージョン)では、/を前に付けて、必要なものをパラメータとして渡すだけです。

c:\> myAppInstaller.exe /foo=wiggle

myApp.issで:

[Setup]
AppName = {param:foo|waggle}

|waggleは、一致するパラメーターがない場合のデフォルト値を提供します。 Innoセットアップでは、大文字と小文字は区別されません。これは、コマンドラインオプションを処理するための特に便利な方法です。インストーラーが気にするコマンドラインパラメーターをユーザーに通知するための洗練された方法があったらいいのにと思います。

ところで、これは@knguyenと@ steve-dunnの両方の回答をいくぶん冗長にします。ユーティリティ関数は、組み込みの{param:}構文とまったく同じように動作します。

30
Dan Locks

@DanLocksの回答に加えて、{param:ParamName | DefaultValue}定数は、定数ページの下部:

http://www.jrsoftware.org/ishelp/index.php?topic=consts

オプションでライセンスページを非表示にするのに非常に便利です。追加する必要があるのはこれだけです(Inno Setup 5.5.6(a)を使用)。

[code]
{ If there is a command-line parameter "skiplicense=true", don't display license page }
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := False
  if PageId = wpLicense then
    if ExpandConstant('{param:skiplicense|false}') = 'true' then
      Result := True;
end;
11
Mark Berry

Innoのコードからコマンドライン引数を解析する場合は、これと同様の方法を使用します。次のようにコマンドラインからinnoスクリプトを呼び出すだけです。

c:\MyInstallDirectory>MyInnoSetup.exe -myParam parameterValue

次に、必要なときにいつでも、次のようにGetCommandLineParamを呼び出すことができます。

myVariable := GetCommandLineParam('-myParam');
{ ================================================================== }
{ Allows for standard command line parsing assuming a key/value organization }
function GetCommandlineParam (inParam: String):String;
var
  LoopVar : Integer;
  BreakLoop : Boolean;
begin
  { Init the variable to known values }
  LoopVar :=0;
  Result := '';
  BreakLoop := False;

  { Loop through the passed in arry to find the parameter }
  while ( (LoopVar < ParamCount) and
          (not BreakLoop) ) do
  begin
    { Determine if the looked for parameter is the next value }
    if ( (ParamStr(LoopVar) = inParam) and
         ( (LoopVar+1) <= ParamCount )) then
    begin
      { Set the return result equal to the next command line parameter }
      Result := ParamStr(LoopVar+1);

      { Break the loop }
      BreakLoop := True;
    end;

    { Increment the loop variable }
    LoopVar := LoopVar + 1;
  end;
end;
10
Steven Dunn

これは私が書いた関数で、Steven Dunnの答えを改善したものです。次のように使用できます。

c:\MyInstallDirectory>MyInnoSetup.exe /myParam="parameterValue"
myVariable := GetCommandLineParam('/myParam');
{ util method, equivalent to C# string.StartsWith }
function StartsWith(SubStr, S: String): Boolean;
begin
  Result:= Pos(SubStr, S) = 1;
end;

{ util method, equivalent to C# string.Replace }
function StringReplace(S, oldSubString, newSubString: String): String;
var
  stringCopy: String;
begin
  stringCopy := S; { Prevent modification to the original string }
  StringChange(stringCopy, oldSubString, newSubString);
  Result := stringCopy;
end;

{ ================================================================== }
function GetCommandlineParam(inParamName: String): String; 
var
   paramNameAndValue: String;
   i: Integer;
begin
   Result := '';

   for i := 0 to ParamCount do
   begin
     paramNameAndValue := ParamStr(i);
     if (StartsWith(inParamName, paramNameAndValue)) then
     begin
       Result := StringReplace(paramNameAndValue, inParamName + '=', '');
       break;
     end;
   end;
end;
10
knguyen

はい、可能です。PascalScriptの ParamStr 関数を使用して、すべてのコマンドラインパラメータにアクセスできます。 ParamCount 関数は、コマンドラインパラメータの数を提供します。

別の可能性は GetCmdTail を使用することです

7
Otherside

Inno Setupは /Name=Value constant を使用した構文{param}のスイッチを直接サポートします。


定数はセクションで直接使用できますが、この使用法はかなり制限されています。

例:

[Registry]
Root: HKCU; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; \
    ValueName: "Mode"; ValueData: "{param:Mode|DefaultMode}"

Pascal Script でスイッチを使用する可能性が高くなります。

スイッチの構文が/Name=Valueの場合、その値を読み取る最も簡単な方法は ExpandConstant function を使用することです。

例えば:

if ExpandConstant('{param:Mode|DefaultMode}') = 'DefaultMode' then
begin
  Log('Installing for default mode');
end
  else
begin
  Log('Installing for different mode');
end;

セクションのエントリを切り替えるためにスイッチ値を使用したい場合は、次のように Check parameter と補助関数を使用できます。

[Files]
Source: "Client.exe"; DestDir: "{app}"; Check: SwitchHasValue('Mode', 'Client')
Source: "Server.exe"; DestDir: "{app}"; Check: SwitchHasValue('Mode', 'Server')
[Code]

function SwitchHasValue(Name: string; Value: string): Boolean;
begin
  Result := CompareText(ExpandConstant('{param:' + Name + '}'), Value) = 0;
end;

皮肉なことに、スイッチの単なる存在(値なし)をチェックすることはより困難です。

@TLamaの回答から関数CmdLineParamExistsを使用できます Inno Setupに条件パラメーターを渡す

function CmdLineParamExists(const Value: string): Boolean;
var
  I: Integer;  
begin
  Result := False;
  for I := 1 to ParamCount do
    if CompareText(ParamStr(I), Value) = 0 then
    begin
      Result := True;
      Exit;
    end;
end;

Pascalスクリプトで関数を使用できることは明らかです。

if CmdLineParamExists('/DefaultMode') then
begin
  Log('Installing for default mode');
end
  else
begin
  Log('Installing for different mode');
end;

しかし、セクションで使用することもでき、最も一般的にはCheckパラメータを使用します。

[Files]
Source: "MyProg.hlp"; DestDir: "{app}"; Check: CmdLineParamExists('/InstallHelp')
7
Martin Prikryl

私は答えを見つけました:GetCmdTail。

0
Similar

私は少し修正しましたknguyen's答え。これで、大文字と小文字が区別されなくなり(コンソール/ myParamまたは/ MYPARAMと記述できます)、デフォルト値を受け入れることができます。また、予想よりも大きなパラメーターを受け取った場合のケースも修正しました(例:/ myParam = "parameterValue"の代わりに/ myParamOther = "parameterValue"。今ではmyParamOtherが一致しません)。

function GetCommandlineParam(inParamName: String; defaultParam: String): String; 
var
   paramNameAndValue: String;
   i: Integer;
begin
   Result := defaultParam;

   for i := 0 to ParamCount do
   begin
     paramNameAndValue := ParamStr(i);
     if  (Pos(Lowercase(inParamName)+'=', AnsiLowercase(paramNameAndValue)) = 1) then
     begin
       Result := Copy(paramNameAndValue, Length(inParamName)+2, Length(paramNameAndValue)-Length(inParamName));
       break;
     end;
   end;
end;
0
Irina Leo

に応答して:

"InnoSetup 5.5.5(およびおそらく他のバージョン)では、必要なものをパラメーターとして渡し、先頭に/を付けます" "@NickG、はい、ExpandConstant関数で展開できるすべての定数"

  • これはそうではありません。 InnoSetup 5.5.6のExpandConstantでコマンドラインパラメータを使用しようとすると、ランタイムエラーが発生します。

PS:私はコメントを直接追加したでしょうが、どうやら私は十分な「評判」を持っていません

0
Sloth