我一直在尝试用括号括起来的不同形式的运算符/表达式,但是找不到正在遇到的交互的解释。即,( )
和$( )
(子表达式运算符)不是等效的。它也不等同于@( )
(数组运算符)。在大多数情况下,这并不重要,但是当尝试将括号的内容作为表达式求值时(例如,变量赋值),它们是不同的。我正在寻找关于 括号的答案,当括号不是明确的一个运算符或另一个运算符,并且about_
文档没有注明时。
($var = Test-Something) # -> this passes through
$($var = Test-Something) # -> $null
@($var = Test-Something) # -> $null
答案 0 :(得分:2)
对于array和subexpression运算符,仅在语法上就需要括号。它们的唯一目的是包装应在其上应用运算符的表达式。
一些例子:
# 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