4

新手问题:我想在 inno-setup 安装结束时运行一个 powershell 脚本 (.ps1)。任何人都可以给我一个关于把这个放在哪里的提示吗?我希望提示用户询问他是否要运行此脚本。

哦,是的,这个脚本的作用是运行 netsh.exe 来打开一个端口,这个脚本很聪明,它从当前上下文中获取 Env:username 和 Env:userdomain。上下文会是运行设置的管理员吗?还是运行 setup.exe 的原始用户?

4

2 回答 2

6

另一种方法是使用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;
于 2017-09-25T18:30:53.103 回答
3
[Run]
.....; Description: Run Script; Flags: postinstall

(有关更多详细信息,请参阅帮助。)默认情况下,这将显示一个复选框并在原始用户的上下文中运行(尽管它取决于安装程序的运行方式)。

不过,您可能需要重新考虑这种方法;如果您正在执行机器范围的安装,那么您可能也应该在机器范围内打开端口。您可以使用调用 WinAPI 的纯 Inno 代码来执行此操作——无需 powershell。(这是一件好事,因为它可能没有安装。)

或者,如果您想将其保留为每个用户的设置,您应该考虑让您的应用程序提示用户在首次运行时做出决定。毕竟,为什么只给应用程序的众多可能用户中的一个用户提供选项呢?

于 2012-12-06T09:07:56.903 回答