我们有一个PowerShell管理单元,需要PowerShell 3.0版才能运行。所以我们在WiX(3.8)文件中使用了以下文件元素:
<File Id="MySnapin.dll"
Name="MySnapin.dll"
Assembly=".net"
KeyPath="yes"
Vital="no"
Checksum="yes"
DiskId="1"
Source="$(var.FilesPath)\Bin\MySnapin.dll"
AssemblyApplication="MySnapin.dll">
<ps:SnapIn Id="MySnapin"
Description="This is a PowerShell snap-in"
Vendor="My Company Inc."
RequiredPowerShellVersion="3.0">
<ps:FormatsFile FileId="MySnapin.format.ps1xml" />
</ps:SnapIn>
</File>
但是,在安装时,在PowerShell中找不到管理单元(Get-PSSnapIn -Registered)。在检查注册表时,发现snapin已在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\PowerShell\3\PowerShellSnapIns\MySnapin
中注册。但是当在DLL上运行installutil.exe时,注册会在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\PowerShell\1\PowerShellSnapIns\MySnapin
中结束,并且powershell会正确地找到它。这是WiX工具集中的错误,还是我在这里做错了什么?
注册到底应该在哪里?
答案 0 :(得分:2)
是的,这听起来像个bug,所以你可能想把它报告给WiX维护者,但还有更好的方法。
添加cmdlet和函数的推荐方法是通过PowerShell模块。管理单元是扩展PowerShell的旧方法,但仍不建议使用。如果您不需要支持将cmdlet添加到旧版本的PowerShell,请使用模块。
模块比管理单元更容易部署。基本上你可以将它们放在任何地方,但是如果你希望用户能够按名称加载它们,它们需要存在于PSModulePath环境变量中。您的安装程序将添加您的文件并更新PSModulePath变量以包含安装文件夹中的Modules文件夹。然后,用户只需拨打Import-Module MyModule
即可加载它们。另请参阅PSModulePath上的documentation。
This博客文章详细介绍了如何编写WiX安装程序来执行此操作。它还提供了有关如何检查是否已安装所需PowerShell版本的说明。基本上,您将检查您为PowerShellEngine \ PowerShellVersion值提到的那些注册表项下的内容。