Inno Setupでインストーラーを準備しています。しかし、追加のカスタム(使用可能なパラメーターはありません)コマンドラインパラメーターを追加し、次のようなパラメーターの値を取得したいと考えています。
setup.exe /do something
/do
が与えられ、何かの値を取得します。出来ますか?これどうやってするの?
InnoSetup 5.5.5(および他のバージョン)では、/
を前に付けて、必要なものをパラメータとして渡すだけです。
c:\> myAppInstaller.exe /foo=wiggle
myApp.issで:
[Setup]
AppName = {param:foo|waggle}
|waggle
は、一致するパラメーターがない場合のデフォルト値を提供します。 Innoセットアップでは、大文字と小文字は区別されません。これは、コマンドラインオプションを処理するための特に便利な方法です。インストーラーが気にするコマンドラインパラメーターをユーザーに通知するための洗練された方法があったらいいのにと思います。
ところで、これは@knguyenと@ steve-dunnの両方の回答をいくぶん冗長にします。ユーティリティ関数は、組み込みの{param:}構文とまったく同じように動作します。
@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;
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;
これは私が書いた関数で、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;
はい、可能です。PascalScriptの ParamStr
関数を使用して、すべてのコマンドラインパラメータにアクセスできます。 ParamCount
関数は、コマンドラインパラメータの数を提供します。
別の可能性は GetCmdTail
を使用することです
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')
私は答えを見つけました:GetCmdTail。
私は少し修正しました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;
に応答して:
"InnoSetup 5.5.5(およびおそらく他のバージョン)では、必要なものをパラメーターとして渡し、先頭に/を付けます" "@NickG、はい、ExpandConstant関数で展開できるすべての定数"
PS:私はコメントを直接追加したでしょうが、どうやら私は十分な「評判」を持っていません