如何在PowerShell中转义花括号{...}?

9

我需要生成多行带有GUID的XML标签:

<xmltag_10 value="{ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ}"/>
<xmltag_11 value="{ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ}"/>

等等其他的

我在一个循环中有这一行代码,每次迭代生成$guid,并打印出不带括号的guid

Write-Host ('<xmltag_{0} value="{1}"/>' -f $i,$guid)
<xmltag_10 value="ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ"/>

添加一组花括号,我得到了

Write-Host ('<xmltag_{0} value="{{1}}"/>' -f $i,$guid)
<xmltag_10 value="{1}"/>

我该如何转义外部花括号?我尝试使用 `{{1}}` 进行转义,但是出现了


Error formatting a string: Input string was not in a correct format..

添加我的复制和测试代码:

$i=10
while($i -lt 21)
{
    $guid = ([guid]::NewGuid()).ToString().ToUpper();
    Write-Host ('<xmltag_{0} value="{1}"/>' -f $i,$guid)
    $i++
}
1个回答

15

要避免大括号冲突,只需要将它们重复两次即可:

'{0}, {{1}}, {{{2}}}' -f 'zero', 'one', 'two'
# outputs:
# zero, {1}, {two} 
# i.e. 
# - {0} is replaced by zero because of normal substitution rules 
# - {{1}} is not replaced, as we've escaped/doubled the brackets
# - {2} is replaced by two, but the doubled brackets surrounding {2} 
#   are escaped so are included in the output resulting in {two}

所以你可以这样做:

Write-Host ('<xmltag_{0} value="{{{1}}}"/>' -f $i,$guid)

但是: 在您的情况下,您不需要使用 -f; 如果您需要使用大括号字面值,则会有问题。请尝试以下方法:

$i=10
while($i -lt 21)
{
    $guid = ([guid]::NewGuid()).ToString().ToUpper();
    Write-Host "<xmltag_$i value=`"$guid`"/>"
    $i++
}

这里使用了双引号字符串中的常规变量替换(但需要使用 `" 进行双引号转义,反斜杠是转义字符)。


另一个选项是使用格式说明符,即格式B会在GUID周围加上大括号。可惜它也会将GUID格式化为小写,因此如果输出大小写是要求的一部分,则不适用此方法。

Write-Host ('<xmltag_{0} value="{1:B}"/>' -f $i, $guid)

13
虽然 "-f" 不是必需的,但如果将来需要它,可以使用以下语句:Write-Host ('xmltag_{0} value="{{{1}}}"/>' -f $i,$guid),其中 "$i" 和 "$guid" 分别代表变量。 - EBGreen
谢谢@EBGreen。我会选择你的答案作为更好的答案。 - ekkis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接