【问题标题】:PowerShell Nested Here-StringPowerShell 嵌套在此处字符串
【发布时间】:2017-02-28 21:09:58
【问题描述】:

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

$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 的可能性不大(但它可能会发生),因此我觉得有必要进行一些防御性编程以适应这种情况。

【问题讨论】:

    标签: powershell escaping herestring


    【解决方案1】:

    使用双引号,无论是外部的here-string:

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

    或者对于内部的here-string:

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

    【讨论】:

    • 我在我的脚本中使用了单引号 here-sting,因为它可能包含 HTML。如果我使用双引号,那么 javascript 函数调用将被误解为 PowerShell 子表达式并因此被扩展。
    • 然后使用双引号作为内部字符串。
    • 我无法控制所提供的输入。外部进程调用 powershell 脚本,提供 here-string 的内容作为参数。
    • 请更新您的问题,并完整描述您的问题。我们不是在这里玩 20 个问题。
    • 请接受我的道歉 - 我确实可以控制外部此处字符串中的内容。不然怎么逃??将内部此处的字符串更改为使用双引号,我会接受它。这似乎是更新内容的最简洁方式
    【解决方案2】:

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

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

    结果:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2017-05-04
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      相关资源
      最近更新 更多