Wix安装程序自定义操作Powershell脚本未正确执行

时间:2018-12-03 09:02:45

标签: powershell wix windows-installer custom-action

在安装过程中,我需要自定义一些配置文件,这基本上是为了搜索和替换作为属性提供给msi intaller的某些关键字。 自定义操作如下所示:

 <CustomAction Id="SetApplicationProperties"
    Directory="CONFIG.DIR"
    ExeCommand="powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command &quot;cat application.properties.template | % { $_ -replace 'SERVERNAME','[SERVERNAME]' } > application.properties.customer&quot; "
    Execute="deferred"
    Impersonate="no"
  />

但是,我只得到一个空的“ application.properties.customer”文件。安装程序日志文件中没有错误/警告。 我尝试了各种不同的引号组合,但是没有成功。 将命令简化为:

ExeCommand='powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command "cat application.properties.template  > application.properties.test" '

有效,因此引用“ -replace ...”语句似乎有问题。

有人建议如何为安装程序正确设置报价吗?

2 个答案:

答案 0 :(得分:0)

被认为有害的PowerShell CA :使用PowerShell进行自定义操作是触发非常糟糕的运行时要求。它既是脚本又是托管代码-两者本身都存在问题。脚本通常很难调试,并且可以触发防病毒锁定,并且托管代码取决于.NET运行时,并且具有许多众所周知的技术陷阱(版本问题,CLR版本的加载行为,还有很多其他问题。) )。 如果可以,请避免执行PowerShell自定义操作

XML更新 :这是XML文件吗?如果是这样,也许您可​​以尝试WiX自己的XML更新功能?也许会看到以下答案:Added new application setting to app.config but MSI won't install it (doesn't overwrite)

JSON If it is JSON let me lob you just a link,到目前为止我还没有使用过。我在书签中找到的所有内容。掠夺github.com是我的常用方法。只需搜索即可。

INI :也许甚至是INI格式?如果是这样,我没有样品适合您。商业工具InstallShield和Advanced Installer允许您从INI文件中检索值。 MSI的内置功能可能太奇怪了(编码问题,功能集有限)。我不确定WiX是否扩展了对检索INI文件值的支持。

答案 1 :(得分:0)

与此同时,经过反复试验,我自己找到了解决问题的方法,我发现在从项目到执行的“转移”过程中,消除了“ {”和“ }”。 我发现this链接可以作为进一步实验的起点。 结果是[\{] VALUE [\}]可用于“转义”括号。 现在,工作代码如下:

  ExeCommand="powershell -NoLogo -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command &quot;cat application.properties.template | % [\{] $_ -replace '&lt;SERVERNAME&gt;','[SERVERNAME]' [\}] > application.properties.customer 2>&amp;1 &quot; "