Powershell 为什么括号会导致赋值产生结果?

Powershell 为什么括号会导致赋值产生结果?,powershell,Powershell,考虑一下下面的PowerShell: PS> $x = 'y' PS> ($x = 'y') y 为什么添加参数会导致打印值 编辑:一些更有趣的案例: PS> $z = ($x = 'y') PS> $z y PS> $( $x = $y ) PS> $z = $( $x = $y ) PS> $z 括号告诉shell首先计算括号内的值,然后打印结果。在你的第一个命令中,它是任务;但是,第二个命令将被计算并打印结果,即“y” 更新 PS&

考虑一下下面的PowerShell:

PS> $x = 'y'
PS> ($x = 'y')
y
为什么添加参数会导致打印值

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

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

括号告诉shell首先计算括号内的值,然后打印结果。在你的第一个命令中,它是任务;但是,第二个命令将被计算并打印结果,即“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”表示子表达式构造和简单括号之间的区别在于如何处理可作废语句操作也被视为可作废语句


在简单括号()中,不会丢弃可作废语句,但在子表达式$()中,会丢弃这些语句。

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

PS> $x = $a++
显然,
$a++
必须有一个值才能工作。然而:

PS> if (...) $a++
您不希望它打印出
$a
的值。因此,结果被丢弃

分组括号将覆盖此行为,并强制将结果返回到管道,即使该结果可作废:

PS> ($x = 'y')
'y'
另一方面,要使不可撤销的表达式无效,请将其强制转换为
void
,或将其管道化为
Out Null

PS> mkdir Foo | Out-Null
PS> [void](mkdir Bar)
资源 那么问题

-7.1.1分组括号,但它们不使用“可作废表达式”术语

Blog post

“可撤销表达式”由“PowerShell in Action”使用,其作者在MS中负责PowerShell。我刚刚复制了它。:-)的链接已更改。