PowerShell 3 ExpandString丢失文本

时间:2013-12-12 06:35:44

标签: powershell powershell-v3.0

我发现在PowerShell 3中,ExpandString正在截断我的模板字符串,只是给出了它的开头。这在PowerShell 2中顺利运行,所以我不确定出了什么问题。

目标是将$theSetting的值插入模板字符串中。请注意,我使用正则表达式来转义引号和坟墓,以便PowerShell不会尝试扩展它们,这似乎工作正常。

PS > $theSetting = 'x'
PS > $template = '<?xml version="1.0" encoding="utf-8" ?><AppSettings><Setting value="${theSetting}"/></AppSettings>'
PS > $template = $template -replace "('|`"|``)", '`$1'
PS > $template
<?xml version=`"1.0`" encoding=`"utf-8`" ?><AppSettings><Setting value=`"${theSetting}`"/></AppSettings>
PS > $ExecutionContext.InvokeCommand.ExpandString($template)
<?xml version="

出于某种原因,它在第一次双重报价后将其切断。感谢任何帮助,以确定PowerShell 2和3之间的变化。

正如您可能猜到的那样,给定模板文本,我实际上是从文件加载模板并将内容写回来,这用于配置文件,这些文件比这里看到的示例模板更加变化和复杂。因此,像正则表达式这样简单的东西并不是真正的选择。

为了未来读者的利益,不要这样做。使用真正的模板引擎(例如,Moustache)。

1 个答案:

答案 0 :(得分:2)

Powershell 3改变了将字符串解析为不再需要将"更改为`"的方式。我不太确定为什么它将它评估为字符串的结尾。

就像Keith说的那样,如果你删除替换码,你就可以了。您还可以检测是否在较低的PowerShell版本上运行并执行替换,如下所示:

if ($PSVersionTable.PSVersion.Major -lt 3) { $var = $var -replace '"','`"' }

希望这有帮助