我已经测试并运行了我的PS1脚本,他们运行查找没有任何问题。所以我尝试将它们集成到我的WiX安装程序中,但它们只是失败了,但是愚蠢的安装程序永远不会回复有关它失败的原因...
我在我的WiX wxs文件中有这些:
<Property Id="InstallPlugin" Value=""Powershell.exe -File [#InstallPS1]"" />
<CustomAction Id="InstallPlugin" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>
<Property Id="UninstallPlugin" Value=""Powershell.exe -File [#UninstallPS1]"" />
<CustomAction Id="UninstallPlugin" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>
<InstallExecuteSequence>
<Custom Action="InstallPlugin" Before="InstallFinalize">NOT Installed</Custom>
<Custom Action="UninstallPlugin" After="InstallInitialize">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>
我捕获了安装日志,我可以看到正在调用的脚本然后使用代码1603失败,这并不意味着什么......
MSI (s) (F0:B0) [11:15:45:969]: Running as a service.
MSI (s) (F0:B0) [11:15:45:972]: Hello, I'm your 32bit Elevated Non-remapped custom action server.
WixQuietExec: Entering WixQuietExec in C:\Windows\Installer\MSI19C1.tmp, version 3.11.1701.0
WixQuietExec: "Powershell.exe -File C:\Program Files (x86)\Blah\install.ps1"
WixQuietExec: Error 0x80070002: Command failed to execute.
WixQuietExec: Error 0x80070002: QuietExec Failed
WixQuietExec: Error 0x80070002: Failed in ExecCommon method
CustomAction InstallPlugin returned actual error code 1603 but will be translated to success due to continue marking
我尝试了CustomAction
属性的各种组合,但这根本没有帮助。我很想使用Return="check"
,但这会阻止我的安装程序完成(我的安装程序安装其他所有内容没有问题,没有错误,只有ps1脚本以某种方式阻止)。
如果我导航到我已安装的文件夹,例如C:\Program Files (x86)\Blah
并手动运行我的脚本.\install.ps1
,它会按预期运行并运行。
任何WiX专家都能给我一些排除故障的提示吗?谷歌搜索没有帮助...
PS:在install.ps1
中,它会启动一个提升的PowerShell会话(但由于运行安装程序的人必须具有开始时的管理员权限,因此无关紧要),我不确定如果这导致错误,如果是,那么我如何解决我的脚本启动另一个脚本?
编辑:
我试图运行的脚本是超级用户论坛中的posted here。基本上,我只是通过Windows注册表试图找到安装的Exchange Server并获取内置的EMS脚本并加载它。
答案 0 :(得分:1)
WiX安静执行CA要求powershell.exe完全限定并包装在引号中。
“[SystemFolder] WindowsPowerShell \ v1.0 \ powershell.exe”-NoProfile -ExecutionPolicy Bypass -File“[#fileKey]”
或类似的东西。但说实话,我可能会在c#/ DTF中执行此操作,或者使用c#/ DTF创建一个powershell管道并以这种方式调用它。更多地控制调用,错误处理,日志记录等等。
答案 1 :(得分:0)
经过几个小时的锤击,我开始工作的唯一方法是使用-Command
代替-File
,我还需要使用SetProperty
代替{{} 1}}。
出于某种原因,Property
和<Property>
无效:
-File
我不得不强迫自己使用<Property Id="InstallPlugin" Value=""powershell.exe" -NoProfile -ExecutionPolicy Bypass -File '[#TestPS1]'"" />
,<SetProperty>
和Before
来触发执行。
-Command
好消息是,这是有效的,但不好的,无关的消息是,安装程序启动的<SetProperty Id="InstallPlugin"
Before="InstallPlugin"
Sequence="execute"
Value =""powershell.exe" -Command "cd '[INSTALLFOLDER]'; & '[#InstallPS1]' ; exit $$($Error.Count)"" />
<CustomAction Id="InstallPlugin" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="deferred" Return="check" Impersonate="no" />
似乎无法访问Windows注册表...我将打开一个不同的SO问题。
答案 2 :(得分:-2)
我认为这更像是一个MSI问题。我建议使用:
msiexec 'path/file' /l*v logfile.txt
这将捕获来自msi的详细日志记录。我过去从msiexec获得的唯一CLI输出是警告我包已经在运行,没有关于可执行文件实际执行的操作。