PowerShell 嵌套此处字符串

PowerShell Nested Here-String

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

$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

在嵌套的 @''@ 前加一个反引号(重音符号)作为转义字符,但它也被视为文字,因此出现在 [= 的输出中14=]。

是否有正确方法在不干扰输出的单引号此处字符串中转义单引号此处字符串?

注意:

我应该提到外部 here-string 的内容是动态填充的,该内容由另一个程序作为命令行参数提供给 powershell 脚本。这没有反映在示例代码中,因为我不想用我非常具体且有点小众的实现来混淆问题。

外部 here-string 包含内部 here-string 的可能性不大(但有可能发生),因此我认为为了适应这种情况,需要进行一些防御性编程。

对外部 here-string 使用双引号:

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

或内部字符串:

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

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

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

结果:

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

hello
@'
'@
bye

PS >

注意开头和结尾的多余空行。如果省略 { 之后和 } 之前的换行符,就可以避免它们。

如有必要,您可以使用 ToString() 函数将 ScriptBlock 显式转换为字符串。

不确定此解决方法是否适用于任何用例,但它看起来相当干净,因为 ScriptBlock 无需解释即可获取所有内容,并且不会被任何花括号混淆,也不会对任何引号感兴趣。