【问题标题】:powershell variable syntax $($a)?powershell 变量语法 $($a)?
【发布时间】:2014-11-18 00:37:09
【问题描述】:

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

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

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

感谢大家对这个措辞可怕的问题的帮助。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    $()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 所知道的,没有美元符号的括号本质上也是子表达式。当它们在字符串中时,它们不会被评估为子表达式,否则它们通常会。这是一个令人沮丧的怪癖,没有明显的区别。

    【讨论】:

    • 您还可以提到,防止冒号被解释为命名空间分隔符的更简单方法是编写 ${a}:\calendar
    • 顺便说一句,(pipeline)$(statement-list) 之间的主要区别在于$() 包含一个语句列表,其中包括ifwhile 等以及一个管道,但是括号需要管道,即赋值、表达式或命令。同样在字符串中,只有 $() 有意义。
    【解决方案2】:

    $() 是子表达式运算符。它导致对包含的表达式进行评估,并将所有表达式作为数组(如果有多个)或作为标量(单个值)返回。普通括号 () 只是数学优先级运算符,因此只在算术表达式中工作以提供优先级

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

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

    给予

    5
    

    "($a.Length)"
    

    给予

    "(Hello.Length)"
    

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

    (1;2)
    

    而这个

    $(1;2)
    

    计算为一个数组并输出:

    1
    2
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      相关资源
      最近更新 更多