1

考虑一下 PowerShell:

PS> $x = 'y'
PS> ($x = 'y')
y

为什么添加括号会导致值被打印?

编辑:一些更有趣的案例:

 PS> $z = ($x = 'y')
 PS> $z
 y
 PS> $( $x = $y )
 PS> $z = $( $x = $y )
 PS> $z
4

2 回答 2

2

括号告诉外壳程序首先评估括号内的值,然后打印结果。在您的第一个命令中,它是分配;然而,第二个是一个将被评估并打印结果的命令,即'y'

更新

PS> $z = ($x = 'y') # assignment, no print , ($x = 'y') returns 'y'
PS> $z    
y
PS> $( $x = $y ) # this is a voidable expression whose result is discarded when used directly as a statement. so, $( $x = $y ) -eq $null
PS> $z = $( $x = $y ) # same to above
PS> $z

“PowerShell in Action”指出子表达式构造和简单括号之间的区别在于如何处理可无效语句。++,--,+=,-= 操作也被视为可撤销语句。

在简单的括号 () 中,可撤销语句不会被丢弃,但在子表达式 $() 中,它们会被丢弃。

于 2012-11-02T03:24:31.143 回答
1

具有副作用的表达式在用作语句时通常不会返回其结果。例如:

PS> $x = $a++

显然,$a++必须具有此值才能工作。然而:

PS> if (...) $a++

你不希望它打印出$a. 所以结果被丢弃。

分组括号会覆盖此行为,并强制将结果返回到管道,即使它是可撤销的:

PS> ($x = 'y')
'y'

另一方面,要使不可撤销的表达式无效,请将其强制转换为void或通过管道将其转换为Out-Null

PS> mkdir Foo | Out-Null
PS> [void](mkdir Bar)

资源

所以问题为什么它需要一对额外的支架?

Windows PowerShell 语言规范- 7.1.1 分组括号,但它们不使用“可撤销表达式”术语。

文 PowerShell ABC's - V 代表可撤销语句

于 2012-11-02T07:20:50.467 回答