是什么$($ VARIABLENAME)在PowerShell中扩展的字符串是什么意思?(What

2019-06-21 08:28发布

我已经看到了一些示例脚本的在线使用此。 最近,我看到它在脚本的自动化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 。 我缺少的东西吗? 没有任何理由使用括号和额外的美元符号?

Answer 1:

语法有助于评估它里面的表达。

$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



Answer 2:

为了补充Amith乔治有用的答案了更多背景信息

从我可以告诉, $($taskTitle)似乎是等同于$taskTitle

事实上,在的情况下"..." ,一个可扩展的字符串 (插值字符串):

  • 你不需要$(...)用一个简单的变量引用 ,如$taskTitle$env:HOME

    • 有时候,你必须(或可选择)使用的形式${taskTitle}${env:HOME} -即{...}周围的标识符-以便从字符串中的后续字符歧义的变量名。
  • 你需要$(...)别的

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

简而言之:

  • $(...)里面的“ ... ”,需要比简单的变量引用任何其他,并允许你里面嵌入整个语句 "..." ; 像往常一样,当字符串被评估时, $(...)部分替换为嵌入语句(S)(字符串化) 输出

  • 如果你不想想想,当$(...)是和是不需要的,你可以选择一直使用它(例如, $($taskTitle)但要注意,它的繁琐输入和视觉“吵”。

    • 警告 :存在边缘的情况下的行为$($var)一样的$var / ${var}即如果$var集合 (实施[System.Collections.IEnumerable]这种情况发生只包含一个项目 -见PetSerAl下面的评论。
  • 除非引用变量/嵌入语句的值已经是一个字符串,它使用的是.NET 字符串化 .ToString()方法 ,与支持文化敏感的字串类型字符串化不变的文化 ,严格意义上显着的扭曲,就像美国英语格式; 例如, "$(1.2)" 总是产生1.2 ,即使在培养物中,其中,是十进制标记; 看到这个答案我的更多。

文档

本作的官方名称$(...)子表达式运算符 ,如(简洁)记录在Get-Help about_Operators ,虽然解释有没有讨论运营商在扩张字符串上下文中的具体运用。

相反, Get-Help about_Quoting_Rules ,其中讨论了字符串文字,包括可扩展的字符串,显示的例子 $(...)只在扩张的字符串的情况下使用。



文章来源: What does $($variableName) mean in expandable strings in PowerShell?