41

我在网上看到了许多使用它的示例脚本。最近,我在自动化 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. 我错过了什么吗?有什么理由使用括号和额外的美元符号吗?

4

2 回答 2

44

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

$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阅读更多内容

于 2012-11-28T22:42:14.830 回答
26

为了补充Amith George 的有用答案,提供更多背景信息

据我所知,$($taskTitle)似乎相当于$taskTitle.

实际上,在 的上下文中"...",一个可扩展的字符串(插值字符串):

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

    • 有时您必须(或可能选择)使用形式${taskTitle}${env:HOME}- 即,{...}围绕标识符 - 以便区分变量名称与字符串中的后续字符。
  • 您确实需要$(...)其他任何东西

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

简而言之:

  • $(...)...除了简单的变量引用之外,inside " " 是必需的,它允许您将整个语句嵌入其中"...";像往常一样,在评估字符串时,该$(...)部分将替换为嵌入语句的(字符串化)输出

  • 如果您不想考虑什么时候需要,什么时候$(...)不需要,您可以选择始终使用它(例如,$($taskTitle)),但请注意打字很麻烦并且视觉上“嘈杂”。

    • 警告:有一种极端情况$($var),即的行为与/的行为$var${var}不同,即 if$var是一个碰巧只包含一个项目的集合(实现) - 请参阅下面PetSerAl的评论。[System.Collections.IEnumerable]
  • 除非引用的变量/嵌入语句的值已经是一个字符串,否则它会使用 .NET方法进行字符串化,值得注意的是,支持文化敏感字符串化的类型会使用不变的文化进行字符串化,松散地说,就像 US-英文格式;例如,总是产生,即使在小数点为 的文化中也是如此;有关更多信息,请参阅我的这个答案.ToString()"$(1.2)" 1.2,

文档

的正式名称$(...)子表达式 operator,如(简洁地)记录在 中Get-Help about_Operators,尽管那里的解释没有讨论运算符在可扩展字符串的上下文中的具体用途。

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

于 2018-02-28T13:51:20.660 回答