如何解决MSI安装程序中的PS1脚本执行问题?

时间:2017-07-25 15:59:06

标签: powershell debugging wix windows-installer

我已经测试并运行了我的PS1脚本,他们运行查找没有任何问题。所以我尝试将它们集成到我的WiX安装程序中,但它们只是失败了,但是愚蠢的安装程序永远不会回复有关它失败的原因...

我在我的WiX wxs文件中有这些:

<Property Id="InstallPlugin" Value="&quot;Powershell.exe -File [#InstallPS1]&quot;" />
<CustomAction Id="InstallPlugin" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>

<Property Id="UninstallPlugin" Value="&quot;Powershell.exe -File [#UninstallPS1]&quot;" />
<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脚本并加载它。

3 个答案:

答案 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="&quot;powershell.exe&quot; -NoProfile -ExecutionPolicy Bypass -File '[#TestPS1]'&quot;" /> <SetProperty>Before来触发执行。

-Command

好消息是,这是有效的,但不好的,无关的消息是,安装程序启动的<SetProperty Id="InstallPlugin" Before="InstallPlugin" Sequence="execute" Value ="&quot;powershell.exe&quot; -Command &quot;cd '[INSTALLFOLDER]'; &amp; '[#InstallPS1]' ; exit $$($Error.Count)&quot;" /> <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输出是警告我包已经在运行,没有关于可执行文件实际执行的操作。