Как запустить скрипт PowerShell во время установки MSI, который принимает параметры командной строки

Вопрос или проблема

Мне нужно передать 2 параметра в MSI при установке электронного приложения из командной строки. Например:
msiexec /i "C:\example\filepath\ExampleAppInstaller.msi" USERID="1234" APIKEY="5678" /quiet

Я хочу, чтобы MSI выполнял скрипт PowerShell, который сохраняет эти параметры во временном файле на компьютере пользователя на каком-то этапе процесса установки. Когда приложение запускается в первый раз после установки, оно будет считывать из временного файла и использовать параметры в приложении.

Часть, с которой у меня возникают проблемы, — это создание пользовательского действия в MSI, которое будет запускать скрипт PowerShell, создающий временный файл. Я пытался использовать набор инструментов Wix, но не могу заставить это работать. У меня версия Wix 5.0.1+2f00cbe6.

Вот скрипт PowerShell, который я пытаюсь выполнить во время установки MSI (названный ‘writeParams.ps1’):

param(
    [string]$UserID,
    [string]$ApiKey
)

# Определяем каталоги и пути файлов динамически с использованием переменной окружения
$AppDataFolder = "$env:APPDATA\ExampleAppTest"
$filePath = "$AppDataFolder\installParams.json"

# Проверяем, существует ли папка, если нет, создаем ее
if (-not (Test-Path -Path $AppDataFolder)) {
    New-Item -Path $AppDataFolder -ItemType Directory
}

# Создаем содержимое JSON с предоставленными параметрами
$jsonContent = @{
    userId = $UserID
    apiKey = $ApiKey
} | ConvertTo-Json

# Записываем содержимое JSON в файл
$jsonContent | Out-File -FilePath $filePath

# Выход с кодом успеха
exit 0

Я пробовал собрать MSI с помощью файла .wixproj. Вот мой файл ExampleAppProject.wixproj:

<Project Sdk="WixToolset.Sdk/5.0.1">

  <PropertyGroup>
    <OutputType>Package</OutputType>
    <WixOutputName>ExampleAppInstaller</WixOutputName>
    <WixOutputType>MSI</WixOutputType>
  </PropertyGroup>

  <ItemGroup>
    <WixSource Include="Product.wxs" />
  </ItemGroup>

</Project>

А вот мой файл Product.wxs:

<?xml version="1.0"?>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">

  <!-- Информация о продукте -->
  <Product Id="*" Name="ExampleApp" Language="1033" Version="1.0.0.0" Manufacturer="Example" UpgradeCode="86a341fc-f2ff-4fc6-9627-8127bb1efc68">
    <Package InstallerVersion="500" Compressed="yes" InstallScope="perMachine" />

    <!-- Элемент Media определяет файл кабинета -->
    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

    <!-- Каталоги определяют путь установки -->
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="ExampleApp"/>
      </Directory>
    </Directory>

    <!-- Функция определяет, что будет установлено -->
    <Feature Id="DefaultFeature" Level="1">
      <ComponentGroupRef Id="ProductComponents"/>
    </Feature>
  </Product>

  <!-- Определяем файлы для установки -->
  <Fragment>
    <DirectoryRef Id="INSTALLFOLDER">
      <Component Id="PowerShellComponent" Guid="1e20057b-3f79-4258-b054-27767beb202c">
        <File Id="PowerShellScript" Source="writeParams.ps1" KeyPath="yes"/>
      </Component>
    </DirectoryRef>
  </Fragment>

  <!-- Группа компонентов для группировки компонентов -->
  <Fragment>
    <ComponentGroup Id="ProductComponents">
      <ComponentRef Id="PowerShellComponent"/>
    </ComponentGroup>
  </Fragment>

  <!-- Определяем пользовательское действие для запуска скрипта PowerShell -->
  <Fragment>
    <CustomAction Id="RunPowerShellScript"
                  Property="powershell.exe"
                  ExeCommand="-ExecutionPolicy Bypass -File &quot;[INSTALLFOLDER]writeParams.ps1&quot; -UserID [USERID] -ApiKey [APIKEY]"
                  Execute="deferred"
                  Return="check"
                  Impersonate="no"/>

    <!-- Запускаем пользовательское действие после копирования файлов установки -->
    <InstallExecuteSequence>
      <Custom Action="RunPowerShellScript" After="InstallFiles">NOT Installed</Custom>
    </InstallExecuteSequence>
  </Fragment>

</Wix>

Я застрял на этом уже некоторое время, поэтому любая помощь была бы очень признательна!

Ответ или решение

Как выполнить скрипт PowerShell во время установки MSI, принимающий параметры командной строки

В данной статье мы обсудим, как передать параметры во время установки MSI-пакета для приложения Electron и выполнить скрипт PowerShell, использующий эти параметры для сохранения их в временный файл на компьютере пользователя. Мы будем использовать набор инструментов WiX, чтобы создать экземпляр MSI, который будет реализовывать это поведение.

Шаг 1: Подготовка PowerShell скрипта

Ваш скрипт PowerShell (writeParams.ps1) выглядит следующим образом:

param(
    [string]$UserID,
    [string]$ApiKey
)

$AppDataFolder = "$env:APPDATA\ExampleAppTest"
$filePath = "$AppDataFolder\installParams.json"

if (-not (Test-Path -Path $AppDataFolder)) {
    New-Item -Path $AppDataFolder -ItemType Directory
}

$jsonContent = @{
    userId = $UserID
    apiKey = $ApiKey
} | ConvertTo-Json

$jsonContent | Out-File -FilePath $filePath
exit 0

Убедитесь, что этот файл находится в каталоге, который будет установлен при установке вашего приложения.

Шаг 2: Создание .wixproj файла

Ваш проект, ExampleAppProject.wixproj, выглядит правильно. Но убедитесь, что вы имеете правильные зависимости и настройки в вашем проекте.

<Project Sdk="WixToolset.Sdk/5.0.1">
  <PropertyGroup>
    <OutputType>Package</OutputType>
    <WixOutputName>ExampleAppInstaller</WixOutputName>
    <WixOutputType>MSI</WixOutputType>
  </PropertyGroup>
  <ItemGroup>
    <WixSource Include="Product.wxs" />
  </ItemGroup>
</Project>

Шаг 3: Конфигурация Product.wxs

Ваш файл Product.wxs также хорошо структурирован, однако вам нужно внести некоторые изменения, чтобы убедиться, что параметры передаются корректно. Вот обновленный пример:

<?xml version="1.0"?>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
  <Product Id="*" Name="ExampleApp" Language="1033" Version="1.0.0.0" Manufacturer="Example" UpgradeCode="86a341fc-f2ff-4fc6-9627-8127bb1efc68">
    <Package InstallerVersion="500" Compressed="yes" InstallScope="perMachine" />
    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="ExampleApp"/>
      </Directory>
    </Directory>

    <Feature Id="DefaultFeature" Level="1">
      <ComponentGroupRef Id="ProductComponents"/>
    </Feature>

    <!-- Определение компонентов -->
    <Fragment>
      <DirectoryRef Id="INSTALLFOLDER">
        <Component Id="PowerShellComponent" Guid="1e20057b-3f79-4258-b054-27767beb202c">
          <File Id="PowerShellScript" Source="writeParams.ps1" KeyPath="yes"/>
        </Component>
      </DirectoryRef>
    </Fragment>

    <Fragment>
      <ComponentGroup Id="ProductComponents">
        <ComponentRef Id="PowerShellComponent"/>
      </ComponentGroup>
    </Fragment>

    <!-- Определение пользовательского действия -->
    <Fragment>
      <CustomAction Id="RunPowerShellScript"
                    Execute="deferred"
                    Return="check"
                    Impersonate="no"
                    ExeCommand="powershell.exe -ExecutionPolicy Bypass -File &quot;[INSTALLFOLDER]writeParams.ps1&quot; -UserID=[USERID] -ApiKey=[APIKEY]"/>

      <InstallExecuteSequence>
        <Custom Action="RunPowerShellScript" After="InstallFiles">NOT Installed</Custom>
      </InstallExecuteSequence>
    </Fragment>

  </Product>
</Wix>

Шаг 4: Передача параметров в MSI

Для того чтобы передать параметры USERID и APIKEY в MSI, вы можете сделать это через командную строку:

msiexec /i "C:\example\filepath\ExampleAppInstaller.msi" USERID="1234" APIKEY="5678" /quiet

При этом должны быть правильно настроены свойства USERID и APIKEY в вашем MSI-файле.

Шаг 5: Построение MSI

Убедитесь, что ваш проект собирается без ошибок с помощью команды:

msbuild ExampleAppProject.wixproj

После выполнения всех этих шагов, ваш MSI должен корректно запускать PowerShell скрипт и передавать ему параметры, а скрипт будет создавать JSON-файл с этими параметрами на компьютере пользователя.

Заключение

Создание MSI-пакета с пользовательскими действиями, использующими PowerShell, может быть сложным процессом, но данный подход с использованием WiX позволяет достичь поставленной цели. Если соблюдены все шаги, вы сможете успешно выполнить свой скрипт во время установки вашего приложения Electron и сохранить параметры в формате JSON для дальнейшего использования.

Оцените материал
Добавить комментарий

Капча загружается...