【问题标题】:Powershell Formatting for a String字符串的 Powershell 格式化
【发布时间】:2022-03-30 19:37:18
【问题描述】:

我有一个字符串,我想动态插入一个变量。例如;

$tag = '{"number" = "5", "application" = "test","color" = "blue", "class" = "Java"}'

我想完成:

$mynumber= 2
$tag = '{"number" = "$($mynumber)", "application" = "test","color" = "blue", "class" = "Java"}'

我想要的是在字符串上插入变量,但它没有通过。我猜 '' 将所有设置为字符串。关于我应该如何处理这个问题的任何建议?

谢谢!

powershell 测试和反复试验。还有谷歌。

【问题讨论】:

    标签: powershell string-interpolation quoting


    【解决方案1】:

    您当前的尝试不起作用的原因是 PowerShell 中的单引号 (') 字符串文字是逐字字符串 - 不会尝试扩展子表达式管道或变量表达式。

    如果您想要一个可扩展的字符串文字,而不必转义字符串本身包含的所有双引号 ("),请使用 here-string:

    $mynumber = 2
    
    $tag = @"
    {"number" = "$($mynumber)", "application" = "test","color" = "blue", "class" = "Java"}
    "@
    

    【讨论】:

    • 这仍然给我错误“在此处字符串标题之后但在行尾之前不允许使用任何字符。”
    • @Pablo_perico 您是否删除了@" 和/或"@ 之前的换行符?
    • 是的,我做到了,现在我发现在这种情况下休息确实很重要。感谢 Mathias 的回复和@mkelement 对问题的详细解释。我真的很感激。
    【解决方案2】:

    添加到Mathias' helpful answer

    • 错误地期望在 '...' 字符串中(而不是在 "..." 中)进行字符串插值之前已经出现过很多次,并且像您这样的问题通常作为 this post 的重复而被关闭。

    • 但是,您的问题值得单独回答,因为:

      • 您的用例引入了一个后续问题,即 嵌入 " 字符不能在 "..." 中按原样使用。

      • 更一般地说,链接的帖子是在 argument-passing 的上下文中,其中适用其他规则。


    注意:下面的一些链接指向概念性about_Quoting_Rules 帮助主题的相关部分。

    在 PowerShell 中:

    • "..." 字符串(双引号,称为expandable strings执行字符串插值,即扩展变量值(例如"... $var" 和子表达式(例如, "... $($var.Prop)")

    • 不是 '...' 字符串(单引号,称为verbatim strings),其值使用逐字(字面意思)。

    使用"..."如果字符串值本身包含"字符。

    • 任一 将它们转义为`"""

      • 例如,`";请注意,虽然使用$(...)subexpression operator 永远不会受到伤害(例如 $($mynumber)),但对于 独立 变量引用,例如 $mynumber,则没有必要:

        $mynumber= 2
        $tag = "{`"number`" = `"$mynumber`", `"application`" = `"test`",`"color`" = `"blue`", `"class`" = `"Java`"}"
        
      • 有关转义和转义序列的信息,请参阅概念性 about_Special_Characters 帮助主题。

      • 如果您需要在'...' 中嵌入',请使用'',或使用(单引号)here-string(见下文)。

    • 使用双引号 here-string 代替 (@"<newline>...<newline>"@):

      • 请参阅 Mathias 的回答,但通常请注意此处字符串的严格、多行语法
        • 任何内容(空格除外)都必须跟在同一行的开始分隔符之后 (@" / @')
        • 结束分隔符 ("@ / '@) 必须在该行的最开始 - 甚至不能在它之前出现空格。

    相关答案:


    替代方法字符串插值:

    在某些情况下,动态构造字符串的其他方法也很有用:

    • 使用带有占位符的(逐字)模板字符串,带有-fformat operator

      $mynumber= 2
      # {0} is the placeholder for the first RHS operand ({1} for the 2nd, ...)
      '"number" = "{0}", ...' -f $mynumber # -> "number" = "2", ...
      
    • 使用简单的字符串连接+操作符:

      $mynumber= 2
      '"number" = "' + $mynumber + '", ...' # -> "number" = "2", ...
      

    【讨论】:

    • 非常感谢您的时间和解释。我现在明白为什么字符串插值适用于这种特定情况。我也尝试了 -f 运算符,但没有在其上插入 ` 字符。我总是在 C# 上逐字使用。