PowerShell:表达式的差异

时间:2018-10-19 15:59:15

标签: powershell powershell-core

我一直在尝试用括号括起来的不同形式的运算符/表达式,但是找不到正在遇到的交互的解释。即,( )$( )(子表达式运算符)不是等效的。它也不等同于@( )(数组运算符)。在大多数情况下,这并不重要,但是当尝试将括号的内容作为表达式求值时(例如,变量赋值),它们是不同的。我正在寻找关于 括号的答案,当括号不是明确的一个运算符或另一个运算符,并且about_文档没有注明时。


($var = Test-Something) # -> this passes through
$($var = Test-Something) # -> $null
@($var = Test-Something) # -> $null

about_Operators

2 个答案:

答案 0 :(得分:2)

对于arraysubexpression运算符,仅在语法上就需要括号。它们的唯一目的是包装应在其上应用运算符的表达式。

一些例子:

# always return array, even if no child items found
@(Get-ChildItem -Filter "*.log").Count

# if's don't work inside regular parentheses
$(if ($true) { 1 } else { 0 })

当(仅)将变量赋值放在括号中时,这称为variable squeezing

$v = 1 # sets v to 1 and returns nothing
($v = 1) # sets v to 1 and returns assigned value

通过将变量压缩与subexpression运算符语法(即添加第二对括号)结合使用,可以获得所有示例的直通版本:

($var = Test-Something)
$(($var = Test-Something))
@(($var = Test-Something))

答案 1 :(得分:1)

$()是唯一的。您可以在其中放入多个语句:

$(echo hi; echo there) | measure | % count

2

您还可以放置通常无法通过管道传输的内容,例如foreach()以及是否传输,尽管这些值要等到整个内容完成后才能显示出来。这样,您可以将多个语句放在只需要一个值的任何地方。

$(foreach ($i in 1..5) { $i } ) | measure | % count

5
$x = 10
if ( $( if ($x -lt 5) { $false } else { $x } ) -gt 20)
{$false} else {$true}
for ($i=0; $($y = $i*2; $i -lt 5); $i++) { $y }
$err = $( $output = ls foo ) 2>&1