字符串的 Powershell 格式化

Powershell Formatting for a String

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

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

我想完成:

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

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

谢谢!

powershell 测试和试错。还有 Google.

您当前的尝试无效的原因是 PowerShell 中的 single-quoted (') 字符串文字是 逐字字符串 - 不会尝试用于扩展子表达式管道或变量表达式。

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

$mynumber = 2

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

添加到

  • 错误地期望 '...' 字符串中的字符串插值(与 "..." 中的字符串相反)以前出现过很多次,像你这样的问题经常被作为重复问题关闭this post.

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

    • 你的用例引入了一个follow-up问题,即embedded"字符不能在里面使用as-is "...".

    • 更一般地说,链接的 post 在 argument-passing 的上下文中,其中适用附加规则。


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

在 PowerShell 中:

  • "..."个字符串(double-quoted,调用expandable strings执行字符串插值,即变量值的扩展(例如"... $var"和子表达式(例如"... $($var.Prop)"

  • 不是 '...' 字符串(single-quoted,称为verbatim strings),其值被使用逐字(字面意思)。

对于 "..."如果字符串值 本身 包含 " 个字符。:

  • 或者 将它们转义为 `"""

    • 例如,`";请注意,虽然使用 $(...),但 subexpression operator 永远不会造成伤害(例如 $($mynumber)),但没有必要使用 stand-alone 变量引用如 $mynumber:

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

    • 如果需要在'...'中嵌入',使用'',或者使用(single-quoted)here-string(看下一个)。

  • 使用double-quoted here-string代替(@"<newline>...<newline>"@ ):

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

相关回答:

  • Overview of PowerShell's expandable strings

  • Overview of all forms of string literals in PowerShell

  • 当将字符串作为 命令参数 传递时,它们在某些情况下 隐含地 被视为可扩展字符串(即,就好像它们被 "..."-封闭);例如
    Write-Output $HOME\projects - 见 this answer.


字符串插值的替代方法

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

  • 使用(逐字)模板字符串和占位符-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", ...