我想在WiX中调用OpenOffice的命令行程序。为此,我创建了一个自定义操作,如下所示:
<CustomAction Id="ca_RunOpenOfficeProgram" Return="check" Directory="TARGETDIR" ExeCommand="cmd.exe /K "C:\OpenOffice.org3\program\unopgk.com list --shared"" />
自定义操作正在安装执行顺序中运行:
<InstallExecuteSequence>
<Custom Action="ca_RunOpenOfficeProgram" Before="InstallFinalize" />
</InstallExecuteSequence>
运行生成的MSI文件时,我在命令行中收到以下错误消息:
Invalid command 'C:\OpenOffice.org3\program\unopkg.com' could not be found.
当然,该命令可用,我可以从命令行运行它。但是,如果WiX调用命令行,它就无法工作。 值得注意的是,“list --shared”部分完全被忽略了。
有谁知道这里发生了什么?
答案 0 :(得分:5)
我建议使用WiX工具集中的ShellExecute
custom action。
以下是示例代码:
<Property Id="WixShellExecTarget" Value="[#myapplication.exe]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
将Value
属性WixShellExecTarget
更改为cmd.exe /K "C:\OpenOffice.org3\program\unopgk.com list --shared"
,它应该有效。
答案 1 :(得分:3)
您确定cmd.exe /K "C:\OpenOffice.org3\program\unopgk.com list --shared"
有效吗?看起来你的报价在错误的地方。
并且,您真的希望控制台窗口保持打开状态(/k
)吗?用户是否必须在安装继续之前输入更多命令?您可能需要/c
。请参阅cmd /?
的帮助。
但是,如果只需要一个命令,为什么不直接运行程序呢?
ExeCommand=""C:\OpenOffice.org3\program\unopgk.com" list --shared"
最后,如果以上是唯一需要的命令并且假设C:\OpenOffice.org3\program\unopgk.com
是控制台应用程序,则将打开无用的控制台窗口。使用WiX的QtExecCmdLine自定义操作可以避免这种情况。
如果您正在运行程序来收集信息,并且它是一个控制台应用程序,您可以执行以下操作:
cmd /c "C:\OpenOffice.org3\program\unopgk.com" list --shared >path\out.txt
并使用其他自定义操作来读取文件并对其进行决策或在Windows Installer对话框中向用户显示该文件。这将是一个更好的体验,而不是让用户在控制台窗口中闪烁提示他们必须退出。
答案 2 :(得分:0)
找到解决我问题的方法:
1)正如我对Toms帖子的回答中所写,我在命令行输入错误...愚蠢。
2)关于命令行调用的引用被错放(Toms回答)
3)我发现使用'shared'参数运行'unopkg.com'仅在使用管理权限运行命令行时执行。我认为我的CustomAction中的属性'impersonated =“yes”'就足够了,但它没有用。
我猜我必须深入了解有关UAC的WiX文档。
还要感谢拉尔夫。我没有尝试他的解决方案,但你可能会试一试。