3

我有一个包含两种模板变量的应用程序配置文件。第一个集合将在构建时由一些 powershell 脚本填充。第二个保留在配置文件中,但在运行时使用。

因此,在源代码管理下,该文件可能如下所示:

<property name="$($settings.elementName)" value="${valueThatIsSubstitutedAtRuntime}" />

构建后,我希望它是:

<property name="settingFromPosh" value="${valueThatIsSubstitutedAtRuntime}" />

但不幸的是,它的出现是

<property name="settingFromPosh" value="" />

我正在使用 Powershell for Developers 中描述的模板方法的略微修改版本。基本上,我使用要替换的变量填充 ScriptBlock,读取模板并使用模板内容调用 Invoke-Expression。它成功替换了它可以找到的值但也清除了它不能找到的任何值的脚本。

我不愿意使用正则表达式令牌替换,因为我想要模板中 ps 的全部功能。此外,我不想为我不想在构建期间填充的值引入不同的变量标记。

有没有办法将变量保留在无法替换的位置,或者可能将它们转义以使它们被忽略?

4

2 回答 2

1

将您的字符串放在单引号中,以便 PowerShell 不会尝试扩展其中的任何变量,例如:

<property name="$($settings.elementName)" value='${valueThatIsSubstitutedAtRuntime}' />

然后您可以$ExecutionContext.InvokeCommand.ExpandString(...)在运行时使用扩展字符串,例如:

$foo = 'bar'
$str = '$foo'
$ExecutionContext.InvokeCommand.ExpandString($str)
于 2013-02-17T02:24:03.760 回答
0

你确定这个:

"${valueThatIsSubstitutedAtRuntime}" 

不应该是:

&{valueThatIsSubstitutedAtRuntime} 

第一个是括号变量的语法。我认为它正在寻找一个名为“大括号之间的任何内容”的变量(并没有找到它,因此它返回一个空字符串)。如果它是一个脚本块,我想你会想要调用它。

于 2013-02-17T02:49:03.447 回答