2

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

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

外部的 here-string 不太可能包含内部的 here-string(但它可能会发生),因此我觉得有必要进行一些防御性编程以适应这种情况。

4

2 回答 2

2

使用双引号,对于外部的此处字符串:

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

或对于内部的此处字符串:

$MyString = @'
hello
@"
"@
bye
'@
于 2016-10-19T10:10:44.303 回答
1

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

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

结果:

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

hello
@'
'@
bye

PS >

请注意开头和结尾处的额外空行。如果在 { 之后和 } 之前省略换行符,则可以避免它们。

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

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

于 2018-10-23T14:02:51.800 回答