我有一个简单的问题,为什么有些东西按照它的方式工作,我似乎无法找到原因.我试图运行以下命令:
foreach($a in $list){set-mailboxcalendarpermissions -identity $($a):\calendar
虽然它工作得很好,但我不知道实际添加了什么$( ).当我这样做($a):\calendar时将返回(variable):\calendar括号,但添加额外的"$"修复它.为什么?
谢谢大家对这个措辞严厉的问题的帮助.
$()是一个子表达式运算符.它的意思是"首先评估它,并作为一个独立的声明单独进行".
大多数情况下,当您使用内联字符串时使用它.说:
$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 = "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首先求值,然后应用作用域.
| 归档时间: |
|
| 查看次数: |
3153 次 |
| 最近记录: |