为什么我需要在此Powershell此处字符串中转义最后一个单引号?


1

根据Powershell的“ 关于引用规则 ”:

此处的字符串是单引号或双引号的字符串,其中的引号是按字面意义解释的。

但是,以下字符串在Powershell版本5.0(内部版本10586,修订版117)中导致TerminatorExpectedAtEndOfString异常。在Powershell 2.0版中,它可以按预期工作:

$herestr=@"
'"'
"@
Write-Host $herestr

如果我用反引号(`)引用最后一个单引号,那么here-string在2.0版和5.0版中都可以正常工作。

$herestr=@"
'"`'
"@
Write-Host $herestr

为什么我需要在here字符串中转义最后一个单引号?


1
恕我直言,这是PowerShell解析器中的错误。在语句解析模式下,它首先尝试将第一件事解释为BareWord字符串文字。如果失败,则会产生错误。您可以通过放置额外的空间来解决此问题:$herestr =@"...$herestr= @"...; 或括在括号中:($herestr=@"..."@)
PetSerAl

@PetSerAl:感谢您的反馈。您知道这是已知的错误还是应该报告?
Bram

我认为你的错误有相同的根本原因是这一个
PetSerAl

@PetSerAl:谢谢:我也在github上创建了一个问题,因为尚不清楚uservoice论坛是否仍在使用:github.com/PowerShell/PowerShell/issues/2780。如果您发布了解决方法,则将其列为答案,我会接受的。同时,我发现Posh风格指南建议在等号之前和之后使用空格,这样看来似乎是解决此错误的正确方法。
Bram

Answers:


1

我相信这是PowerShell解析器中的错误。看起来当它处于语句解析模式时,它首先尝试将第一件事解释为BareWord字符串文字。如果失败,则会产生错误。您可以通过在等号前后放置多余的空间来解决此问题:

$herestr =@"
'"'
"@

要么

$herestr= @"
'"'
"@

或使用括号:

[void]($herestr=@"
'"'
"@)

请注意,由于括号不是赋值或增量/减量,因此它们会将表达式的结果写入流水线,这与裸分配表达式不同,因此您需要使用[void]或任何其他方法来显式忽略它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.