$($ variableName)在PowerShell中的可扩展字符串中意味着什么?

时间:2012-11-28 22:37:17

标签: powershell syntax string-interpolation

我在网上看过很多使用它的示例脚本。最近,我在automating TFS上的脚本中看到了它:

[string] $fields = "Title=$($taskTitle);Description=$($taskTitle);Assigned To=$($assignee);"
$fields += "Area Path=$($areaPath);Iteration Path=$($iterationPath);Discipline=$($taskDisciplineArray[$i]);Priority=$($i+1);"
$fields += "Estimate=$($taskEstimateArray[$i]);Remaining Work=$($taskRemainingArray[$i]);Completed Work=$($tasktaskCompletedArray[$i])"

据我所知,$($taskTitle)似乎等同于$taskTitle。我错过了什么吗?有没有理由使用括号和额外的美元符号?

2 个答案:

答案 0 :(得分:32)

语法有助于评估其中的表达式。

$arr = @(1,2,3)

$msg1 = "$arr.length"
echo $msg1 # prints 1 2 3.length - .length was treated as part of the string

$msg2 = "$($arr.length)"
echo $msg2 # prints 3

您可以在http://ss64.com/ps/syntax-operators.html

了解更多信息

答案 1 :(得分:9)

使用更多背景信息补充Amith George's helpful answer

  

据我所知,$($taskTitle)似乎等同于$taskTitle

的确,在 "..."的上下文中,可扩展字符串 (插入字符串):

  • 您不需要$(...)使用简单变量引用 ,例如 $taskTitle 或<强> $env:HOME

    • 有时您必须(或可能选择)使用${taskTitle}${env:HOME}形式 - 即{...}围绕标识符 - 以便消除变量名称与后续字符的歧义字符串。
  • 需要$(...)

    • 访问媒体资源;例如: -
      "count is: $($var.Count)"
    • 嵌入表达式;例如: -
      "path prefix: $($var + '/')"
    • 嵌入整个命令(可能甚至多个命令);例如: -
      "file names: $(Get-ChildItem *.txt | Select-Object -ExpandProperty Name)"

简而言之:

    除了简单的变量引用之外,其他任何内容都需要
  • $(...)...”,并允许您在"..."内嵌入整个语句;像往常一样,当评估字符串时,$(...)部分将替换为嵌入语句中的(字符串化)输出

  • 如果您不想考虑何时不需要$(...),您可以选择始终使用它(例如$($taskTitle) ),但请注意,键入和视觉上“嘈杂”很麻烦。

    • 警告:有一个 边缘案例,其中$($var)的行为的行为相同$var / ${var} ,即如果$var集合(实施[System.Collections.IEnumerable])恰好只包含单项 - 请参阅下面的PetSerAl评论。
  • 除非引用变量的/ embedded语句的值已经是字符串,否则使用.NET .ToString()方法 字符串化,并且值得注意扭曲支持文化敏感字符串化的类型使用不变文化 进行字符串化,从宽松的角度讲,它类似于美国英语格式;例如,"$(1.2)" 始终会产生1.2,即使在,为小数点的文化中也是如此;请参阅我的this answer了解更多信息。

<强>文档

$(...)的正式名称是子表达式运算符 ,正如Get-Help about_Operators中所记载的那样(虽然解释不详)在可扩展字符串的上下文中讨论运算符的特定用法。

相反,讨论字符串文字(包括可扩展字符串)的Get-Help about_Quoting_Rules显示$(...)示例仅在可扩展字符串的上下文中使用。