Wix中的错误? ps:SnapIn使用PowerShell 3.0写入错误的注册表项吗?

时间:2014-09-09 09:26:00

标签: powershell wix powershell-v3.0 wix-extension

我们有一个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工具集中的错误,还是我在这里做错了什么?

注册到底应该在哪里?

1 个答案:

答案 0 :(得分:2)

是的,这听起来像个bug,所以你可能想把它报告给WiX维护者,但还有更好的方法。

添加cmdlet和函数的推荐方法是通过PowerShell模块。管理单元是扩展PowerShell的旧方法,但仍不建议使用。如果您不需要支持将cmdlet添加到旧版本的PowerShell,请使用模块。

模块比管理单元更容易部署。基本上你可以将它们放在任何地方,但是如果你希望用户能够按名称加载它们,它们需要存在于PSModulePath环境变量中。您的安装程序将添加您的文件并更新PSModulePath变量以包含安装文件夹中的Modules文件夹。然后,用户只需拨打Import-Module MyModule即可加载它们。另请参阅PSModulePath上的documentation

This博客文章详细介绍了如何编写WiX安装程序来执行此操作。它还提供了有关如何检查是否已安装所需PowerShell版本的说明。基本上,您将检查您为PowerShellEngine \ PowerShellVersion值提到的那些注册表项下的内容。