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

Kev*_*inD 27 syntax powershell string-interpolation

我在网上看过很多使用它的示例脚本.最近,我在一个关于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])"
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*rge 35

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

$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
Run Code Online (Sandbox Code Playgroud)

您可以在http://ss64.com/ps/syntax-operators.html上阅读更多内容


mkl*_*nt0 12

通过更多背景信息补充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)"

简而言之:

  • $(...)...除了简单的变量引用之外的任何东西都需要在里面" ",并且允许你在里面嵌入整个语句"..." ; 像往常一样,当评估字符串时,该$(...)部分将替换为嵌入语句的(字符串化)输出.

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

    • 警告:有一个边缘的情况下,其中的行为$($var)一样的$var/${var},即如果$var是一个集合(实现[System.Collections.IEnumerable])恰好只包含一个单一的项目 -见PetSerAl下面的评论.
  • 除非引用变量的/ embedded语句的值已经是一个字符串,否则它将使用.NET 方法进行字符串化,显而易见的是,支持文化敏感字符串化的类型使用不变文化进行字符串化,松散地说,就像美国一样 -英文格式; 例如,即使在十进制标记的文化中,总是产量; 看到我的这个答案更多..ToString()"$(1.2)" 1.2,

文件:

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

相反地,Get-Help about_Quoting_Rules,其中讨论了字符串文字包括可膨胀的字符串,显示了实施例$(...)仅在可膨胀串的上下文.

  • 顺便说一句,`“ $ {variable}”`和`“ $($ variable)”`并不总是返回相同的结果。 (3认同)
  • 下面是例如:[要旨](https://gist.github.com/PetSerAl/d6336e2bb76388af59e45f5942fb6935)或[tio.run](https://tio.run/##vY69CsIwFEb3@xSXkiEB6QMEHNog0tkxdIjlgkKaSJJSpPbZY/1DcBAnv@2Dc@Cc/EghHsjanDtrYsQKJe7OMVFfKm8tdenoXSybjRt6CmZvCSfAZfoLlXxocUvpfbl4arcFSkNwyFe6bqV0NHIhyg / 8Ds8wAzy66r92qZ @ 7FE7LBWZwjbp6aQAFm8x8YZwZUeR8BQ) (2认同)
  • 至于解释:这是`$ {a} .GetType()。FullName`和`$($ a..GetType()。FullName`)之间差异的直接结果。以及如何分类集合类型。 (2认同)
  • *这似乎只影响单项收藏,对吗?*据我了解它是如何工作的,是的。要等同于“ $ {variable}”,必须是“ $(,$ variable)”。 (2认同)