【问题标题】:Parameters for WiX's ExePackage and InstallCommandWiX 的 ExePackage 和 InstallCommand 的参数
【发布时间】:2013-06-14 10:04:47
【问题描述】:

我有一个需要传递给它的参数预设的可执行文件,因此需要batch file (.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. Users\user\Desktop\Install\myexe.exe 其他参数值'

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

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

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

每当我用"%quot; 之类的方式在EXE 文件包中引入引号时

<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 包。

是否有解决方案或解决方法?

【问题讨论】:

  • .exe&amp;qout;[otherparam] 的左括号前是否缺少空格?

标签: parameters wix exe


【解决方案1】:

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

【讨论】:

  • 那些是传给bat文件的参数,第一个是exe文件的路径
  • 抱歉,我发帖后才知道这是你想要的。您是否尝试过单引号(')?不确定这是否会起作用。 myexe.bat 的内容是什么?也许有一种方法可以完成它,而不是调用 .bat 文件,这似乎有点 hack。
【解决方案2】:

我遇到这种情况是因为传入的 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 包的尾随空格可能存在问题,因此此修复可能不适用于所有人。

【讨论】:

    【解决方案3】:

    我对 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%
    

    【讨论】:

      【解决方案4】:

      我在尝试将参数传递给 .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);

      这解决了我的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-02
        相关资源
        最近更新 更多