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は必要ありません。(インストールされていない可能性があるため、これは良いことです。)

または、ユーザーごとの設定を維持したい場合は、アプリケーションで最初の実行時にユーザーに決定を求めるプロンプトを表示することを検討する必要があります。結局のところ、なぜあなたのアプリの多くの可能なユーザーのうちの1人だけにオプションを与えるのですか?

于 2012-12-06T09:07:56.903 に答える