我有一个简单的问题,为什么某些东西按照它的方式工作,我似乎无法轻易找出原因。 我试图运行以下命令:
foreach($a in $list){set-mailboxcalendarpermissions -identity $($a):\calendar
虽然它工作得很好,但我不知道添加$( )
实际上做了什么。
当我执行($a):\calendar
时,它将使用括号返回(variable):\calendar
,但添加额外的“$”会修复它。为什么?
谢谢大家对这个措辞严厉的问题的帮助。
答案 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
然后再评估适用范围。