在安装过程中,我需要自定义一些配置文件,这基本上是为了搜索和替换作为属性提供给msi intaller的某些关键字。 自定义操作如下所示:
<CustomAction Id="SetApplicationProperties"
Directory="CONFIG.DIR"
ExeCommand="powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command "cat application.properties.template | % { $_ -replace 'SERVERNAME','[SERVERNAME]' } > application.properties.customer" "
Execute="deferred"
Impersonate="no"
/>
但是,我只得到一个空的“ application.properties.customer”文件。安装程序日志文件中没有错误/警告。 我尝试了各种不同的引号组合,但是没有成功。 将命令简化为:
ExeCommand='powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command "cat application.properties.template > application.properties.test" '
有效,因此引用“ -replace ...”语句似乎有问题。
有人建议如何为安装程序正确设置报价吗?
答案 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 "cat application.properties.template | % [\{] $_ -replace '<SERVERNAME>','[SERVERNAME]' [\}] > application.properties.customer 2>&1 " "