powershell变量语法$($ a)?

时间:2014-11-18 00:37:09

标签: powershell

我有一个简单的问题,为什么某些东西按照它的方式工作,我似乎无法轻易找出原因。 我试图运行以下命令:

foreach($a in $list){set-mailboxcalendarpermissions -identity $($a):\calendar

虽然它工作得很好,但我不知道添加$( )实际上做了什么。 当我执行($a):\calendar时,它将使用括号返回(variable):\calendar,但添加额外的“$”会修复它。为什么?

谢谢大家对这个措辞严厉的问题的帮助。

2 个答案:

答案 0 :(得分:9)

$()subexpression operator。这意味着“首先评估它,并作为独立声明单独进行”。

大多数情况下,当您使用内联字符串时会使用它。说:

$x = Get-ChildItem C:\;
$x | ForEach-Object {
    Write-Output "The file is $($_.FullName)";
}

将其与:

进行比较
$x = Get-ChildItem C:\;
$x | ForEach-Object {
    Write-Output "The file is $_.FullName";
}

您还可以执行$($x + $y).ToString()$(Get-Date).AddDays(10)等内容。

此处,如果没有子表达式,您将获得$a:\calendar。那么,问题在于变量之后的冒号是运算符。具体而言,the scope operator。为了防止PowerShell认为你试图在a命名空间中查找变量,作者将变量放在子表达式中。

就我过去几年使用PS而言,没有美元符号的括号也基本上是子表达式。当它们在字符串中时,它们不会被评估为子表达式,否则它们通常会被评估为子表达式。这是一种令人沮丧的怪癖,没有明显的区别。

答案 1 :(得分:8)

$()是子表达式运算符。它会导致计算包含的表达式,并将所有表达式作为数组(如果有多个)或标量(单个值)返回。简单括号()只是数学优先运算符,因此只能在算术表达式中使用才能优先使用

值得注意的是,$()在字符串中被解释,而()只是字面意思 - 它没有特殊含义。以下是:

$a = "Hello"
"$($a.Length)"

给出

5

,而

"($a.Length)"

给出

"(Hello.Length)"

正如我所说,$()可以包含多个表达式,所有表达式都作为输出返回。 ()不会这样做。所以这是一个错误,因为内容不是算术表达式:

(1;2)

而这

$(1;2)

计算数组并​​输出:

1
2

在应用尾随作用域:运算符之前计算表达式$($ a),并阻止将作用域直接应用于a,而是先评估$a然后再评估适用范围。