Запуск скриптов с помощью платформы поддержки пакетов

Скрипты позволяют ИТ-специалистов динамически настраивать приложение в среде пользователя после его упаковки с помощью 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 в ваш пакет и поместите его в ту же папку, что и ваш исполняемый файл. Этот файл можно скопировать из пакета NuGet PSF или из репозитория PSF Github.

Включение скриптов

Чтобы указать, какие скрипты будут выполняться для каждого упаковаемого исполняемого файла приложения, необходимо изменить файлconfig.json. Чтобы сообщить PSF запустить скрипт перед выполнением упаковаемого приложения, добавьте элемент конфигурации с именем startScript. Чтобы сообщить PSF запустить скрипт после завершения упаковаемого приложения, добавьте элемент конфигурации с именем endScript.

Элементы конфигурации скрипта

Ниже приведены элементы конфигурации, доступные для скриптов. Конечный скрипт игнорирует элементы конфигурации waitForScriptToFinish и stopOnScriptError.

Имя ключа Тип значения Обязательно? По умолчанию Описание
scriptPath струна Да Не применимо Путь к скрипту, включая имя и расширение. Путь относится к рабочему каталогу приложения, если он указан, в противном случае он начинается в корневом каталоге пакета.
scriptArguments струна нет пусто Список аргументов с разделителями пространства. Формат совпадает с вызовом скрипта PowerShell. Эта строка добавляется к scriptPath, чтобы сделать вызов PowerShell.exe допустимым.
runInVirtualEnvironment булевый нет правда Указывает, должен ли скрипт выполняться в той же виртуальной среде, в которой выполняется упаковаемое приложение.
runOnce булевый нет правда Указывает, должен ли скрипт выполняться один раз на пользователя на каждую версию.
showWindow булевый нет неправда Указывает, отображается ли окно PowerShell.
stopOnScriptError булевый нет неправда Указывает, следует ли выйти из приложения, если начальный скрипт завершается сбоем.
waitForScriptToFinish булевый нет правда Указывает, следует ли упаковаированному приложению ожидать завершения запуска скрипта перед началом работы.
timeout DWORD (32-битное целое число) нет БЕСКОНЕЧНЫЙ Сколько времени скрипту будет разрешено выполнять. Когда время истекает, скрипт будет остановлен.

Замечание

Параметр stopOnScriptError: true и waitForScriptToFinish: 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)
  ]
}