【问题标题】:How do you troubleshoot PS1 script execution in MSI installer?如何在 MSI 安装程序中排除 PS1 脚本执行问题?
【发布时间】:2017-07-25 15:59:06
【问题描述】:

我已经测试并运行了我的 PS1 脚本,他们运行 find 没有任何问题。因此,我尝试将它们集成到我的 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 脚本并加载它。

【问题讨论】:

  • 0x80070002 - 删除高字,留下 2 - 找不到文件。
  • @Bill_Stewart 如何确保执行顺序以便我的Custom Action 在安装后运行?它找不到该文件的唯一原因是它试图在安装程序将文件放在那里之前执行...我认为After="InstallFinalize" 会确保文件位于其目标文件夹中。如果我查看实际路径,我的脚本就在那里,我可以复制粘贴命令并运行脚本。所以我不确定它怎么会是File Not Found
  • 我不熟悉 WiX,所以我不是回答您问题的合适人选。我只是说这就是错误的含义。

标签: powershell debugging wix windows-installer


【解决方案1】:

WiX 安静执行 CA 要求 powershell.exe 完全限定并包含在引号中。

"[SystemFolder]WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -File "[#fileKey]"

或类似的东西。但老实说,我可能会在 c# / DTF 中完成这一切,或者使用 c# / DTF 创建一个 powershell 管道并以这种方式调用它。对调用、错误处理、日志记录等进行更多控制。

【讨论】:

  • 没有区别,它给出了完全相同的错误。 WixQuietExec: "C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File 'C:\Program Files (x86)\Blah\test.ps1'" 手动运行该命令不会出错,我的test.ps1 脚本中有echo "hello world"
  • 你在 .exe 之后缺少的 "。我知道这很奇怪,但 EXE 的完整路径必须是 "" args 之后。
  • 我确实试过了,如果你看看我的回答,我正在使用&amp;quot;powershell.exe&amp;quot;。我也尝试了两种方法,它不需要是完全合格的路径。有一些问题,它不适用于-File,但能够在使用-Command 时触发呼叫,似乎是 WiX imo 的一个错误......
  • 不幸的是,MSI AppSearch 不能像那样递归子键。但是您可以使用在立即执行上下文中安排的自定义操作来应用这些业务规则并使用目录设置 MSI 属性,然后将其传递给 AppSearch 以在文件搜索中使用,或者您可以继续执行所有逻辑通过并使用 ps1 的完整路径设置属性。但在那之后它在做什么?通常“自我注册”被认为是 MSI 反模式,我正在尝试分解脚本并将其转换为 MSI 概念以消除自定义操作。
  • 这一切的目标是在 Exchange Server 上注册我的Transport Agent plugin,为此,我需要加载Exchange Management Shell,这是我的powershell 脚本所做的,它找到RemoteExchange.ps1,然后加载它,从那里我运行我的其他脚本来注册并启用我的插件。手动调用我的脚本都可以,只是从 MSI 调用它给我带来了很多麻烦。
【解决方案2】:

经过几个小时的锤击,我让它工作的唯一方法是使用-Command而不是-File,我还需要使用SetProperty而不是Property

由于某种原因,&lt;Property&gt;-File 不起作用:

<Property Id="InstallPlugin" Value="&quot;powershell.exe&quot; -NoProfile -ExecutionPolicy Bypass -File '[#TestPS1]'&quot;" />

我不得不强迫自己使用&lt;SetProperty&gt;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" />

好消息是这可行,但坏消息是不相关的消息是安装程序启动的powershell 似乎无法访问 Windows 注册表...我将打开一个不同的 SO 问题那个。

【讨论】:

  • 我很好奇这个脚本做了什么以及为什么它需要访问注册表。如果你愿意的话,我很乐意为你省去很多痛苦。
  • 我已经更新了我原来的帖子,或者你可以看看这里:superuser.com/a/1234321/459389
【解决方案3】:

我认为这更像是一个 MSI 问题。我建议使用:

msiexec 'path/file' /l*v logfile.txt

这将从 msi 捕获详细日志记录。过去我从 msiexec 获得的唯一 CLI 输出是警告我包已经在运行,而没有关于可执行文件实际在做什么。

【讨论】:

  • MSI 有许多日志记录选项。我想我会建议一些不完全明显的东西,因为这个网站包含所有经验水平的人
  • 实际上它根本不是“MSI”问题。 WiX 安静执行 CA 不是 MSI 的一部分。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2018-03-03
  • 1970-01-01
相关资源
最近更新 更多