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