PowerShell嵌套在此处-字符串

fivyi3re  于 2023-06-23  发布在  Shell
关注(0)|答案(3)|浏览(113)

在脚本中放置以下内容将失败:

$MyString = @'
hello
@'
'@
bye
'@

write-host $MyString

返回的错误如下:

At C:\scripts\test.ps1:6 char:1
+ '@
+ ~~
The string is missing the terminator: '.
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

在嵌套的@''@前面加上一个反引号(重音符)确实可以作为转义字符,但是它也被视为文字,因此出现在$MyString的输出中。
有没有一个正确的方法可以在一个单引号的here字符串中转义一个单引号的here字符串,而不会干扰输出?

备注:

我应该提到,外部的here-string的内容是动态填充的,内容由另一个程序作为命令行参数提供给powershell脚本。这并没有反映在示例代码中,因为我不想用我非常具体和有点利基的实现来模糊这个问题。
外部的here-string不太可能包含内部的here-string(但它可能发生),因此我觉得为了适应这种情况,一些防御性编程是必要的。

o75abkj4

o75abkj41#

使用双引号,或者用于外部的her-string:

$MyString = @"
hello
@'
'@
bye
"@

或者对于内部的here-string:

$MyString = @'
hello
@"
"@
bye
'@
goqiplq2

goqiplq22#

尝试一个ScriptBlock(包含在{}中),而不是外部的Here-String。它适用于原始示例:

$MyString = {
hello
@'
'@
bye
}
write-host $MyString

结果:

PS > $MyString = {
>> hello
>> @'
>> '@
>> bye
>> }
>> write-host $MyString
>>

hello
@'
'@
bye

PS >

请注意开头和结尾处的额外空行。如果省略{和}之前的换行符,就可以避免它们。
如果需要,可以使用ToString()函数将ScriptBlock显式转换为String。
不确定这种解决方法是否适用于任何用例,但它看起来相当干净,因为ScriptBlock接受所有内容而不进行解释,并且不会被任何花括号混淆,也不会对任何引号感兴趣。

hwamh0ep

hwamh0ep3#

无论您选择什么样的here字符串引号字符,总有powershell转义字符,即反引号

$MyString = @"
hello
@`'
`'@
bye
"@

相当于

$MyString = @'
hello
@`'
`'@
bye
'@

如果你需要逃避一个反勾,只要把他们2

Write-Host @"

here is a backtick ``

"@

相关问题