透過套件支援架構執行指令碼

腳本可讓 IT 專業人員在使用 MSIX 封裝之後,將應用程式動態地自訂到使用者的環境。 例如,您可以使用腳本來設定您的資料庫、設定 VPN、掛接共用磁片磁碟機,或動態執行授權檢查。 腳本提供許多彈性。 它們可能會變更登錄機碼,或根據電腦或伺服器設定來執行檔案修改。

您可以使用封裝支援架構 (.PSF) 在封裝的應用程式可執行檔執行之前執行一個 PowerShell 腳本,並在應用程式可執行檔執行之後,執行一個 PowerShell 腳本以進行清除。 應用程式資訊清單中定義的每個應用程式可執行檔都可以有自己的腳本。 您可以將腳本設定為只在第一個應用程式啟動時執行一次,而不會顯示 PowerShell 視窗,讓使用者不會錯誤地結束腳本。 還有其他選項可以設定腳本執行的方式,如下所示。

必要條件

若要啟用腳本來執行,您必須將 PowerShell 執行原則設定為 RemoteSigned 。 您可以執行此命令來執行此動作:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

您必須針對64位 PowerShell 可執行檔和32位 PowerShell 可執行檔設定執行原則。 請務必開啟每個版本的 PowerShell,然後執行上面所示的其中一個命令。

以下是每個可執行檔的位置。

  • 64 位元電腦:
    • 64位可執行檔:% SystemRoot% \system32\WindowsPowerShell\v1.0\powershell.exe
    • 32位可執行檔:% SystemRoot% \SysWOW64\WindowsPowerShell\v1.0\powershell.exe
  • 32 位元電腦:
    • 32位可執行檔:% SystemRoot% \system32\WindowsPowerShell\v1.0\powershell.exe

如需 PowerShell 執行原則的詳細資訊,請參閱 這篇文章

🚩請務必也將 StartingScriptWrapper.ps1 檔案包含在您的封裝中,並將其放在與可執行檔相同的資料夾中。 您可以從.psf NuGet 套件或從.psf Github存放庫複製這個檔案。

啟用腳本

若要指定每個封裝的應用程式可執行檔將執行的腳本,您必須修改 config.xml檔案。 若要告訴 .PSF 在執行封裝的應用程式之前執行腳本,請新增名為的設定專案 startScript 。 若要告訴 .PSF 在封裝的應用程式完成後執行腳本,請新增名為的設定專案 endScript

腳本設定專案

以下是可供腳本使用的設定專案。 結束腳本會忽略 waitForScriptToFinish 和設定 stopOnScriptError 專案。

索引鍵名稱 值類型 必要? 預設 描述
scriptPath 字串 N/A 腳本的路徑,包括名稱和副檔名。 如果有指定,路徑會相對於應用程式的工作目錄,否則會從封裝的根目錄開始。
scriptArguments 字串 No empty 以空格分隔的引數清單。 PowerShell 腳本呼叫的格式是相同的。 這個字串會附加至, scriptPath 以進行有效的 PowerShell.exe 呼叫。
runInVirtualEnvironment boolean No true 指定腳本是否應在封裝應用程式執行所在的相同虛擬環境中執行。
runOnce boolean No true 指定腳本是否應針對每個使用者執行一次(每個版本)。
showWindow boolean No false 指定是否顯示 PowerShell 視窗。
stopOnScriptError boolean No false 指定啟動腳本失敗時是否要結束應用程式。
waitForScriptToFinish boolean No true 指定封裝的應用程式是否應該等待啟動腳本完成,再開始進行。
timeout DWORD No INFINITE 允許腳本執行的時間長度。 經過一段時間後,腳本就會停止。

注意

stopOnScriptError: truewaitForScriptToFinish: false 不支援設定範例應用程式的和。 如果您同時設定這兩個設定專案,.PSF 會傳回錯誤 ERROR_BAD_CONFIGURATION。

範例組態

以下是使用兩個不同應用程式可執行檔的範例設定。

{
  "applications": [
    {
      "id": "Sample",
      "executable": "Sample.exe",
      "workingDirectory": "",
      "stopOnScriptError": false,
      "startScript":
      {
        "scriptPath": "RunMePlease.ps1",
        "scriptArguments": "\\\"First argument\\\" secondArgument",
        "runInVirtualEnvironment": true,
        "showWindow": true,
        "waitForScriptToFinish": false
      },
      "endScript":
      {
        "scriptPath": "RunMeAfter.ps1",
        "scriptArguments": "ThisIsMe.txt"
      }
    },
    {
      "id": "CPPSample",
      "executable": "CPPSample.exe",
      "workingDirectory": "",
      "startScript":
      {
        "scriptPath": "CPPStart.ps1",
        "scriptArguments": "ThisIsMe.txt",
        "runInVirtualEnvironment": true
      },
      "endScript":
      {
        "scriptPath": "CPPEnd.ps1",
        "scriptArguments": "ThisIsMe.txt",
        "runOnce": false
      }
    }
  ],
  "processes": [
    ...(taken out for brevity)
  ]
}