4

我有一个可执行文件,需要将预设的参数传递给它,因此需要一个批处理文件(.bat)。一切都运行良好,直到我发现 [WixBundleLastUsedSource] 中使用的文件夹路径可能包含一个空格。

这是EXE文件打包定义:

<ExePackage Id="myexepackage" Compressed="no" Permanent="yes" Cache="no"    
            After="previousfeature"
            SourceFile="$(var.preprocessorvariable)\myexe.bat"
            InstallCommand="[WixBundleLastUsedSource]myexe.exe [otherparam]" />

这是我尝试过的一些测试以及它们的日志:

这是工作变化:

应用执行包:myexepackage,操作:安装,路径:C:\ProgramData\Package Cache\7AE3BA856B7D415569854BFE32DD3848112B7BFA\myexe.bat,参数:'"C:\ProgramData\Package Cache\7AE3BA856B7D415569854BFE32DD3848112B7BFA\myexe.bat" C:\User \Desktop\Install\myexe.exe 其他参数值'

虽然以下两个日志来自失败:

应用执行包:myexepackage,操作:安装,路径:C:\ProgramData\Package Cache\7AE3BA856B7D415569854BFE32DD3848112B7BFA\myexe.bat,参数:'"C:\ProgramData\Package Cache\7AE3BA856B7D415569854BFE32DD3848112B7BFA\myexe\Users.bat" "C:用户\桌面\安装\myexe.exe"其他参数值'

应用执行包:myexepackage,操作:安装,路径:C:\ProgramData\Package Cache\7AE3BA856B7D415569854BFE32DD3848112B7BFA\myexe.bat,参数:'"C:\ProgramData\Package Cache\7AE3BA856B7D415569854BFE32DD3848112B7BFA\myexe\Users.bat" "C: user\Desktop\Install new\myexe.exe" otherparamvalue'

每当我向 EXE 文件包中引入引号"%quot;

<ExePackage Id="myexepackage" Compressed="no" Permanent="yes" Cache="no" 
            After="previousfeature"
            SourceFile="$(var.preprocessorvariable)\myexe.bat"
            InstallCommand="&quot;[WixBundleLastUsedSource]myexe.exe&quot;[otherparam]" />

它失败了:

e000:错误 0x80070001:进程返回错误:0x1
e000:错误 0x80070001:无法执行 EXE 包。
e000:错误 0x80070001:无法配置每台机器的 EXE 包。

有解决方案或解决方法吗?

4

4 回答 4

1

InstallCommand属性应包含传递给 exe 的参数。它不应该包含 .exe 本身。

于 2013-06-14T13:31:54.717 回答
0

我对 WiX 3.11.1 的体验是,当通过InstallCommandUninstallCommand提供命令参数时,任何双引号都会导致命令处理器(即 cmd.exe)失败。在批处理脚本之间传递双引号可能很棘手,更不用说在 WiX 内部以 XML 编码了。有可能找出正确的反斜杠或其他转义字符集放在每个“”前面。标签,但我决定完全绕过它。

我的解决方案是使用单引号并修改批处理脚本以在执行之前将所有单引号替换为双引号。可以使用其他字符。

<ExePackage Id="myexepackage" Compressed="no" Permanent="yes" Cache="no" 
  After="previousfeature"
  SourceFile="$(var.preprocessorvariable)\myexe.bat"
  InstallCommand="'[WixBundleLastUsedSource]myexe.exe' [otherparam]" />

myexe.bat是这样的:

Set CommandText=%*
Set CommandText=%CommandText:'="%
Call %CommandText%
于 2019-05-07T00:11:16.700 回答
0

当我尝试将参数传递给 .net 二进制文件时,我遇到了类似的问题。

我所做的是使用 [WixBundleLastUsedSource] 作为最后一个参数。

<ExePackage Id="myexepackage" Compressed="no" Permanent="yes" Cache="no"    
    After="previousfeature"
    SourceFile="$(var.preprocessorvariable)\myexe.exe"
    InstallCommand="install [WixBundleLastUsedSource]" />

因此,在 c# 项目中,我跳过了第一个参数并收集了所有其余参数并加入它以获得完整路径并在项目中使用它。

var path = String.Join(" ", parsedArgs);

这解决了我的问题。

于 2021-08-18T21:19:28.290 回答
0

我遇到这种情况是因为传入的 Wix 值以反斜杠结尾。这最终导致第二个双引号在安装引擎的某个地方被转义,结果,第一个引号被剥离。例如:

<ExePackage SourceFile="..\bin\MyEXE.exe" Name="MyEXE.exe" InstallCommand="&quot;InstallDir=[INSTALLDIR]&quot; InstallType=MyType" />

当 [InstallDir] 以反斜杠结尾时,不是两个命令行参数,而是一个,第一个 " 被剥离。"修复" 是在第二个 " 之前添加一个空格:

<ExePackage SourceFile="..\bin\MyEXE.exe" Name="MyEXE.exe" InstallCommand="&quot;InstallDir=[INSTALLDIR] &quot; InstallType=MyType" />

不幸的是,某些 EXE 软件包的尾随空格可能存在问题,因此此修复程序可能不适用于所有人。

于 2019-01-22T19:00:36.923 回答