我在网上看过很多使用它的示例脚本。最近,我在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
。我错过了什么吗?有没有理由使用括号和额外的美元符号?
答案 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
了解更多信息
答案 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
显示$(...)
的示例仅在可扩展字符串的上下文中使用。