psmsi - 使用 PowerShell 创建 MSI。

Created at: 2022-11-25 01:05:32
Language: C#
License: MIT

安装

PSMSI 包括用于创建 MSI 程序包的 cmdlet,这些程序包可以包含所需的任何文件和目录结构。它还包括通过包含自定义 EULA 和映像来自定义安装程序界面的功能。

开始

要开始使用 PSMSI 创建安装程序,你需要下载最新版本的 PSMSI 模块。这可以使用 进行安装。

Install-Module

Install-Module PSMSI

WiX 工具集

此模块基于 Wix 工具集的 v3。通过这个模块,我们可以完成更多的事情。它主要创建WiX XML并运行WiX工具来生成MSI。我们对公关和问题非常开放。请随时查看WiX文档,了解可以添加的功能。

创建你的第一个安装程序

该 cmdlet 用于生成安装程序。它可以包含用于安装的目录和文件。第一步是定义安装程序的基本参数。

New-Installer

产品和升级代码参数是必需的。升级代码是一个 GUID,需要对产品的每个版本保持相同,并且应该与其他产品不同。

New-Installer -ProductName "My First Product" -UpgradeCode '1a73a1be-50e6-4e92-af03-586f4a9d9e82'

在新安装程序 cmdlet 的 Content 参数中,需要包含要在最终用户计算机上安装的根目录。根目录必须是预定义的目录。New-InstallerDirectory 上的一个参数集定义了一个 PredefinedDirectory 参数,你可以使用该参数来选择目标根目录。

New-InstallerDirectory -PredefinedDirectory "LocalAppDataFolder"

现在,你可以选择在根目录中指定嵌套目录。如果它不存在,则将创建它,并在卸载时将其删除。

New-InstallerDirectory -DirectoryName "My First Product"

最后,你可以在目录中包含文件。新安装程序文件 cmdlet 接受具有要安装的文件的路径的源参数。

New-InstallerFile -Source .\MyTextFile.txt

此安装程序的完整脚本如下所示。

New-Installer -ProductName "My First Product" -UpgradeCode '1a73a1be-50e6-4e92-af03-586f4a9d9e82' -Content {
    New-InstallerDirectory -PredefinedDirectory "LocalAppDataFolder"  -Content {
       New-InstallerDirectory -DirectoryName "My First Product" -Content {
          New-InstallerFile -Source .\license.txt
       }
    }
 } -OutputDirectory (Join-Path $PSScriptRoot "output")

运行上述脚本将在输出目录中生成 WXS、WXSOBJ 和 MSI 文件。MSI 是你需要提供给最终用户的唯一文件。WXS 和 WXSOBJ 文件是用于生成这些安装程序的 Windows Installer XML Toolkit 的工件。

安装

所有用户安装

你可以使用参数从默认安装更改为安装。

-RequriesElevation
New-Installer
PerUser
PerMachine

下面创建一个安装程序,该安装程序将安装到程序文件文件夹。

New-Installer -ProductName "My First Product" -UpgradeCode '1a73a1be-50e6-4e92-af03-586f4a9d9e82' -Content {
    New-InstallerDirectory -PredefinedDirectory "ProgramFilesFolder"  -Content {
       New-InstallerDirectory -DirectoryName "My First Product" -Content {
          New-InstallerFile -Source .\license.txt
       }
    }
 } -OutputDirectory (Join-Path $PSScriptRoot "output") -RequiresElevation

“添加\删除程序”图标

将在“添加\删除程序”中显示的应用程序图标可以使用 的 定义。

AddRemoveProgramsIcon
New-Installer

New-Installer -Product "My First Product" -UpgradeCode '1a73a1be-50e6-4e92-af03-586f4a9d9e82' -Content {
    New-InstallerDirectory -PredefinedDirectory "ProgramFilesFolder"  -Content {
       New-InstallerDirectory -DirectoryName "My First Product" -Content {
          New-InstallerFile -Source .\license.txt
       }
    }
 } -OutputDirectory (Join-Path $PSScriptRoot "output") -AddRemoveProgramsIcon "icon.ico"

升级代码

该值应为静态值,以确保升级成功。通过 定义升级代码。

UpgradeCode
New-Installer

New-Installer -ProductName "My First Product" -UpgradeCode '1a73a1be-50e6-4e92-af03-586f4a9d9e82' -Content {
    New-InstallerDirectory -PredefinedDirectory "ProgramFilesFolder"  -Content {
       New-InstallerDirectory -DirectoryName "My First Product" -Content {
          New-InstallerFile -Source .\license.txt
       }
    }
 } -OutputDirectory (Join-Path $PSScriptRoot "output") 

版本

安装程序版本是使用 的参数设置的。你可以通过增加版本并保持升级代码不变来提供升级。

Version
New-Installer

版本默认为 1.0。

New-Installer -ProductName "My First Product" -UpgradeCode '1a73a1be-50e6-4e92-af03-586f4a9d9e82' -Content {
    New-InstallerDirectory -PredefinedDirectory "ProgramFilesFolder"  -Content {
       New-InstallerDirectory -DirectoryName "My First Product" -Content {
          New-InstallerFile -Source .\license.txt
       }
    }
 } -OutputDirectory (Join-Path $PSScriptRoot "output") -Version 2.0

自定义操作

自定义操作允许你在安装和卸载期间运行 PowerShell 脚本。你需要将脚本作为文件包含在安装程序中。使用 的参数引用要执行的 PS1 文件。

FileId
New-InstallerCustomAction

例如,你可能有一个名为 ID 的脚本。

MyCustomAction.ps1
CustomAction

New-InstallerFile -Source .\myCustomAction.ps1 -Id 'CustomAction'

然后,你可以在安装过程中将该脚本用作自定义操作。

New-InstallerCustomAction -FileId 'CustomAction' -RunOnInstall

参数

可以将参数传递给 PowerShell .exe 和脚本。该参数将自定义参数传递给 PowerShell.exe(如 -NoProfile)。该参数定义要传递给脚本本身的参数。

Arguments
ScriptArguments

检查返回值

这将检查PowerShell.exe的退出代码。如果退出代码不为零,则会导致安装失败。

运行安装时间

在安装期间运行自定义操作。

运行卸载

在卸载期间运行自定义操作。

目录和文件

你可以使用 和 创建目录和文件。目录应从 MSI 提供的预定义目录之一开始。

New-InstallerDirectory
New-InstallerFile

预定义目录

使用 的参数定义安装的根文件夹。可以使用 和 等目录。

PredefinedDirectory
New-InstallerDirectory
Program Files
AppData
CommonAppData

自定义文件夹

自定义文件夹显示在预定义的目录中。你可以嵌套文件夹以创建文件夹树。然后,文件夹可以包含文件。使用 的参数创建目录。用于指定要包括的文件夹或文件。

DirectoryName
New-InstallerDirectory
Content

包括 on 属性将允许最终用户在安装过程中选择目录。

Configurable
New-InstallerDirectory

New-InstallerDirectory -DirectoryName "My First Product" -Content {
    New-InstallerFile -Source .\license.txt
} -Configurable

文件

文件由其当前位置和 ID 定义。该参数应标识要包含的文件。它在树中的位置将定义它在磁盘上的安装位置。

Source
New-InstallerDirectory

New-InstallerDirectory -DirectoryName "My First Product" -Content {
    New-InstallerFile -Source .\license.txt
}

快捷方式

可以使用 为安装程序定义快捷方式。你将使用 Id 定义快捷方式的位置,并按 Id 引用文件。

New-InstallerShortcut
New-InstallerDirectory

例如,要按 ID 定义文件,应包含参数 。

Id
New-InstallerFile

New-InstallerFile -Source .\MyTextFile.txt -Id "myTestFile"

接下来,你将在目录中定义快捷方式并按 ID 引用文件。

New-InstallerDirectory -PredefinedDirectory "DesktopFolder" -Content {
    New-InstallerShortcut -Name "My Test File" -FileId "myTestFile"
}

工作目录

你可以通过指定文件夹的 ID 来设置快捷方式的工作目录。下面的示例将工作目录设置为安装目录的 ID。

New-Installer -ProductName "MyImage" -UpgradeCode (New-Guid) -Version 1.0.0 -Content {
    New-InstallerDirectory -PredefinedDirectoryName ProgramFilesFolder -Content {
        New-InstallerDirectory -DirectoryName 'MyDir' -Id 'MyDir' -Content {
            New-InstallerFile -Id 'Image' -Source 'services.png'
        }
    }
    New-InstallerDirectory -PredefinedDirectoryName DesktopFolder -Content {
        New-InstallerShortcut -Name 'Test' -FileId 'Image' -WorkingDirectoryId 'MyDir'
    }    
} -OutputDirectory .\installer -RequiresElevation

用户界面

你可以使用 的参数自定义安装程序的用户界面。

UserInterface
New-Installer
New-InstallerUserInterface

用户界面可以包括安装程序的自定义图形和 EULA。

 $UserInterface = New-InstallerUserInterface -Eula (Join-Path $PSScriptRoot 'eula.rtf') -TopBanner (Join-Path $PSScriptRoot "banner.png") -Welcome (Join-Path $PSScriptRoot "welcome.png")

铁人三项软件免费工具

有关更多免费工具,请访问 铁人三项软件 免费工具索引