2012-11-02 70 views

回答

2

括號告訴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在行動」規定的子表達式結構和簡單的括號之間的區別在於如何可撤銷聲明被治療。 ++, - ,+ =, - =操作也被視爲可空的語句。

在簡單圓括號()中,可丟棄語句不會被丟棄,但是在子表達式$()中,它們將被丟棄。

+0

「可撤銷的表達」 是關鍵,謝謝! –

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) 

資源

SO質疑Why it needs an extra pair of bracket?

Windows PowerShell Language Specification - 7.1.1分組圓括號,但他們不使用 「可撤銷的表達」 的術語。

博客文章PowerShell ABC's - V is for Voidable Statements

+0

「PowerShell in Action」使用「無效表達式」,其作者負責MS中的powershell。我只是複製它。 :-) – Jackie

相關問題