我需要生成多行带有 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++
}
要转义大括号,只需将它们加倍:
'{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)