powershell变量语法$($ a)?

Jon*_*Jon 6 powershell

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

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

虽然它工作得很好,但我不知道实际添加了什么$( ).当我这样做($a):\calendar时将返回(variable):\calendar括号,但添加额外的"$"修复它.为什么?

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

Bac*_*its 9

$()是一个子表达式运算符.它的意思是"首先评估它,并作为一个独立的声明单独进行".

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

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

比较一下:

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

你也可以这样做$($x + $y).ToString(),或者$(Get-Date).AddDays(10).

在这里,没有子表达式,你会得到$a:\calendar.那么,问题在于变量之后的冒号是运算符.具体来说,范围运营商.为了防止PowerShell认为你试图在a命名空间中查找变量,作者将变量放在子表达式中.

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

  • 您还可以提到一种更简单的方法来防止冒号被解释为命名空间分隔符,那就是编写`$ {a}:\ calendar` (2认同)

Jam*_*rld 8

$()是子表达式操作者使所包含的表达式来进行评估,并将其返回所有表达式为阵列(如果有一个以上的),或作为标量(单值).简单括号()只是数学优先运算符,因此只能在算术表达式中使用以获得优先权

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

$a = "Hello"
"$($a.Length)"
Run Code Online (Sandbox Code Playgroud)

5
Run Code Online (Sandbox Code Playgroud)

"($a.Length)"
Run Code Online (Sandbox Code Playgroud)

"(Hello.Length)"
Run Code Online (Sandbox Code Playgroud)

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

(1;2)
Run Code Online (Sandbox Code Playgroud)

而这个

$(1;2)
Run Code Online (Sandbox Code Playgroud)

计算到数组并输出:

1
2
Run Code Online (Sandbox Code Playgroud)

表达式$($ a)在应用尾随作用域:运算符之前进行求值,并防止将作用域直接应用于a,而是$a首先求值,然后应用作用域.