Вопрос или проблема
Мне нужно передать 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 "[INSTALLFOLDER]writeParams.ps1" -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 "[INSTALLFOLDER]writeParams.ps1" -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 для дальнейшего использования.