新手问题:我想在inno-setup安装结束时运行一个powershell脚本(.ps1)。任何人都可以给我一个提示放在哪里?我希望系统询问用户是否要运行此脚本。
哦,是的,这个脚本的作用是运行netsh.exe来打开一个端口,脚本很聪明,它从当前上下文中获取Env:username和Env:userdomain。上下文是否是运行安装程序的管理员?或者它是运行setup.exe的原始用户?
答案 0 :(得分:4)
另一种方法是使用代码中的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;
答案 1 :(得分:2)
[Run]
.....; Description: Run Script; Flags: postinstall
(有关更多详细信息,请参阅帮助。)默认情况下,这将显示一个复选框并在原始用户的上下文下运行(尽管它取决于安装程序的运行方式)。
但您可能想重新考虑这种方法;如果您正在执行机器范围的安装,那么您应该在机器范围内打开端口。您可以使用调用WinAPIs的纯Inno代码执行此操作 - 无需PowerShell。 (这是一件好事,因为它可能没有安装。)
或者,如果您希望保持每用户设置,您应该考虑让应用程序在第一次运行时提示用户做出决定。毕竟,为什么只为您应用的众多可能用户中的一个提供选项?