2012-12-05 94 views
1

新手问题:我想在INNO-安装程序安装结束时运行PowerShell脚本(名为.ps1)。任何人都可以给我一个提示放在哪里?我希望提示用户询问他是否要运行此脚本。PowerShell脚本之后安装

哦,是的,这是什么脚本并运行netsh.exe中打开一个端口,剧本是聪明的,它抓住ENV:从当前上下文USERDOMAIN:用户名和Env。上下文是运行安装程序的管理员?或者它会是运行setup.exe的原始用户?

回答

2
[Run] 
.....; Description: Run Script; Flags: postinstall 

(详情参见帮助。)默认情况下,这将显示一个复选框和原始用户的上下文中运行(尽管它取决于如何安装程序运行位)。

你可能要重新考虑这种做法,虽然;如果您正在执行机器范围的安装,那么您应该也可以在机器范围内打开端口。你可以用纯Inno代码调用WinAPI来做到这一点 - 不需要PowerShell。 (这是一件好事,因为它可能未安装。)

另外,如果你想保持它的每个用户设置,你应该考虑让你的应用程序提示在第一次运行的决定的用户。毕竟,为什么只给你的应用程序的许多可能的用户中的一个选项?

+0

一个非常好的问题。但在这种情况下,我们的用户喜欢限制谁可以为单个用户开放端口的安全性。我注意到InstallShield已经允许PowerShell脚本作为设置的一部分。 INHO:如果inno setup删除了Pascal,并且使用集成的PowerShell for vista,win7和up安装,那将会很棒。 –

+0

那么,你可以自由地建议在官方Inno建议网站上。但我怀疑它会得到很多牵引力,因为Inno本身就是用Pascal编写的。 – Miral

2

另一种方法是使用运行从代码中ShellExec脚本。

[Files] 
Source: "yourPowershell.ps1"; DestDir: "{app}"; Flags: overwritereadonly replacesameversion promptifolder; 

[Tasks] 
Name: "runpowershell"; Description: "Do you want to run Powershell script?" 

[Code] 

procedure CurStepChanged(CurStep: TSetupStep); 
var 
    ErrorCode: Integer; 
    ReturnCode: Boolean; 
begin 
    if CurStep = ssPostInstall then begin 

    if(IsTaskSelected('runpowershell')) then begin 
     ExtractTemporaryFile('yourPowershell.ps1'); 
     ReturnCode := ShellExec('open', '"PowerShell"', ExpandConstant(' -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -File "{tmp}\YourPowershell.ps1"'), '', SW_SHOWNORMAL, ewWaitUntilTerminated, ErrorCode); 

    if (ReturnCode = False) then 
     MsgBox('Message about problem. Error code: ' + IntToStr(ErrorCode) + ' ' + SysErrorMessage(ErrorCode), mbInformation, MB_OK); 

    end; 
end;