如何在Powershell中避免使用花括号{...}?

ord*_*of1 4 powershell guid escaping

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

<xmltag_10 value="{ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ}"/>
<xmltag_11 value="{ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ}"/>
Run Code Online (Sandbox Code Playgroud)

等等

我在循环中有此行,其中每次迭代都会生成$ guid,并且它会打印guid而不用大括号括起来

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

添加一组花括号,我得到

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

如何逃避外花括号?我曾尝试使用`{{1}`}逃脱,但我得到了

Error formatting a string: Input string was not in a correct format..
Run Code Online (Sandbox Code Playgroud)

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

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

bri*_*ist 8

要避开花括号,只需将它们加倍:

'{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}
Run Code Online (Sandbox Code Playgroud)

因此,您可以这样做:

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

然而; 在您的情况下,您不需要使用-f;如果您需要使用文字花括号,则不合适。尝试这个:

'{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}
Run Code Online (Sandbox Code Playgroud)

这在双引号引起来的字符串中使用常规变量替换(但是它确实需要使用`“来转义双引号(反引号是转义字符)。


另一个选择是使用格式说明符。即,格式B导致GUID被花括号包围。可悲的是,它还以小写格式设置了GUID,因此,如果输出的大小写是您的要求的一部分,那么这将不合适。

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

  • 尽管-f不是必需的,但如果您确实需要它,则仅供以后参考:Write-Host('xmltag_ {0} value =“ {{{1}}}” /&gt;'-f $ i,$ guid) (13认同)