Command line 是否可以通过Inno设置接受自定义命令行参数

Command line 是否可以通过Inno设置接受自定义命令行参数,command-line,inno-setup,command-line-arguments,Command Line,Inno Setup,Command Line Arguments,我正在准备一个带有Inno安装程序的安装程序。但我想添加一个额外的自定义(无可用参数)命令行参数,并希望获得参数的值,如: setup.exe /do something 检查是否给出了/do,然后获取某物的值。可能吗?如何执行此操作?我找到了答案:GetCmdTail。是的,您可以使用PascalScript中的函数访问所有命令行参数。该函数将为您提供命令行参数的数量 另一种可能性是使用您可以将参数传递给安装程序脚本。安装并阅读有关传递自定义命令行参数的文档。如果要从inno中的代码解析命令

我正在准备一个带有Inno安装程序的安装程序。但我想添加一个额外的自定义(无可用参数)命令行参数,并希望获得参数的值,如:

setup.exe /do something

检查是否给出了
/do
,然后获取某物的值。可能吗?如何执行此操作?

我找到了答案:GetCmdTail。

是的,您可以使用PascalScript中的函数访问所有命令行参数。该函数将为您提供命令行参数的数量


另一种可能性是使用

您可以将参数传递给安装程序脚本。安装并阅读有关传递自定义命令行参数的文档。

如果要从inno中的代码解析命令行参数,请使用类似的方法。只需从命令行调用inno脚本,如下所示:

c:\MyInstallDirectory>MyInnoSetup.exe -myParam parameterValue
然后,您可以在任何需要的地方这样调用GetCommandLineParam:

myVariable:=GetCommandLineParam('-myParam');
{========================================================================================================================}
{允许使用键/值组织进行标准命令行解析}
函数GetCommandlineParam(inParam:String):String;
变量
LoopVar:整数;
BreakLoop:布尔型;
开始
{将变量初始化为已知值}
LoopVar:=0;
结果:='';
BreakLoop:=假;
{通过传入的arry循环查找参数}
而((LoopVar((LoopVar+1)这是我编写的函数,它改进了Steven Dunn的答案。您可以将其用作:

c:\MyInstallDirectory>MyInnoSetup.exe /myParam="parameterValue"
myVariable:=GetCommandLineParam('/myParam');
{util方法,相当于C#string.StartsWith}
函数StartsWith(SubStr,S:String):布尔值;
开始
结果:=Pos(SubStr,S)=1;
结束;
{util方法,相当于C#string.Replace}
函数StringReplace(S,oldSubString,newSubString:String):String;
变量
stringCopy:String;
开始
stringCopy:=S;{防止修改原始字符串}
StringChange(stringCopy、oldSubString、newSubString);
结果:=stringCopy;
结束;
{ ================================================================== }
函数GetCommandlineParam(inParamName:String):String;
变量
paramNameAndValue:字符串;
i:整数;
开始
结果:='';
对于i:=0的参数
开始
paramNameAndValue:=ParamStr(i);
如果(使用(inParamName、ParamName和Value)启动),则
开始
结果:=StringReplace(paramNameAndValue,inParamName+'=','';
打破
结束;
结束;
结束;
使用InnoSetup 5.5.5(可能还有其他版本),只需将任何需要的内容作为参数传递,前缀为
/

c:\> myAppInstaller.exe /foo=wiggle
在myApp.iss中:

[Setup]
AppName = {param:foo|waggle}
如果没有参数匹配,
|waggle
将提供默认值。Inno安装程序不区分大小写。这是处理命令行选项的一种特别好的方法:它们刚刚出现。我希望有一种巧妙的方法让用户知道安装程序关心哪些命令行参数

顺便说一句,这使得@knguyen和@steve dunn的答案都有些多余。实用程序函数的功能与内置的{param:}语法完全相同。

响应:

使用InnoSetup 5.5.5(可能还有其他版本),只需将所需内容作为参数传递,前缀为/
@NickG,是的,您可以通过ExpandConstant函数展开的每个常量

  • 情况并非如此。尝试在InnoSetup 5.5.6中的ExpandConstant中使用命令行参数会导致运行时错误

PS:我会直接添加评论,但显然我没有足够的“声誉”

除了@DanLocks的回答,常量页面底部附近记录了{param:ParamName | DefaultValue}常量:

我发现它对于选择性地抑制许可证页面非常方便


我修改了一点knguyen的答案。现在它不区分大小写(您可以在控制台/myParam或/myParam中编写),并且可以接受默认值。此外,我还修复了当您收到比预期更大的参数时的大小写(例如:/myParamOther=“parameterValue”代替/myParam=“parameterValue”.现在myParamOther不匹配)


Inno Setup直接支持使用语法
/Name=Value
的交换机


您可以在节中直接使用该常数,尽管这种用法非常有限

例如:

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

您可能更希望在中使用开关

如果开关的语法为
/Name=Value
,则读取其值的最简单方法是使用

例如:

如果ExpandConstant({param:Mode | DefaultMode}')='DefaultMode',则
开始
日志(“默认模式下安装”);
结束
其他的
开始
日志(“为不同模式安装”);
结束;

如果要使用开关值切换节中的条目,可以使用和辅助功能,如:

[Files]
Source: "Client.exe"; DestDir: "{app}"; Check: SwitchHasValue('Mode', 'Client')
Source: "Server.exe"; DestDir: "{app}"; Check: SwitchHasValue('Mode', 'Server')
[代码]
函数SwitchHasValue(名称:string;值:string):布尔值;
开始
结果:=CompareText(ExpandConstant('{param:'+Name+'}'),值)=0;
结束;

具有讽刺意味的是,仅仅检查开关的存在(没有值)更为困难

Use可以使用@TLama的答案中的函数
CmdLineParamExists

函数CmdLineParamExists(常量值:字符串):布尔值;
变量
I:整数;
开始
结果:=假;
对于I:=1的参数
如果CompareText(ParamStr(I),Value)=0,则
开始
结果:=真;
出口
结束;
结束;
显然,您可以使用Pascal脚本中的函数:

如果CmdLineParameters存在('/DefaultMode'),则
开始
登录
[Registry]
Root: HKCU; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; \
    ValueName: "Mode"; ValueData: "{param:Mode|DefaultMode}"
[Files]
Source: "Client.exe"; DestDir: "{app}"; Check: SwitchHasValue('Mode', 'Client')
Source: "Server.exe"; DestDir: "{app}"; Check: SwitchHasValue('Mode', 'Server')
[Files]
Source: "MyProg.hlp"; DestDir: "{app}"; Check: CmdLineParamExists('/InstallHelp')