2012-01-23 74 views
6

下面的PowerShell腳本爲什麼它需要一對額外的支架?

"one","two","three" | % { "$(($l++)): $_" } 

將打印

 
1: one 
2: two 
3: three 

然而,在去除周圍$l++

"one","two","three" | % { "$($l++): $_" } 

支架,將打印

 
: one 
: two 
: three 
+0

哦,你有這個社區的孩子! :-) –

回答

12

這是因爲$l++可撤銷聲明。在powershell中,某些類型的 表達式在用作語句時不會顯示。 可變語句包括賦值和增量/減量運算符。當它們在表達式中使用時,它們會返回一個值,但是當它們用作獨立語句時,它們不會返回任何值。這是很好的Windows PowerShell中通過布魯斯·帕耶特解釋行動

遞增和遞減運營商幾乎不包含在PowerShell中 ,因爲他們推出的一個問題。在諸如C和C#的語言中,當您使用 其中一個運算符作爲語句時: $ a ++ 不顯示任何內容。這是因爲C和C#語句不返回值。但是,在PowerShell的 中,所有語句都會返回一個值。這導致了混亂。人們 會寫腳本這樣的:

$sum=0 
$i=0 
while ($i -lt 10) { $sum += $i; $i++ } 
$sum 

和驚訝1至10顯示看到的數字。這是因爲$ a ++ 返回了一個值,PowerShell顯示了每條語句的結果。這個 非常混亂,我們幾乎將這些操作符從語言中刪除。然後我們 打了一個可以無效的陳述的想法。基本上,這意味着某些類型的 表達式在用作語句時不會顯示。無效的陳述包括 賦值和增量/減量運算符。當它們在 表達式中使用時,它們會返回一個值,但是當它們用作獨立語句時,它們將不會返回任何值。同樣,這是其中的一個細節,不會影響您使用PowerShell的方式,而不會影響您的預期效果。 (來源:Windows Powershell在行動)

+0

我認爲很多人的最佳答案:) – manojlds

+0

在Deep Dive中,Bruce也提到這是if語句和循環的工作原理:if($ foo = Get-RandomTrueFalse){「This can run !「} – JasonMArcher

0

我認爲有需要做兩項工作:它發生在內部括號

  • 檢索$l的值,它發生在外層的括號

    1. 執行$l++(增加變量)。

    這裏就是一個例證:

    $l = 0 
    "$($l++ ; $l)" 
    

    輸出:1其中

    $l = 0 
    "$($l++)" 
    

    不輸出任何東西。

    爲了接收輸出,我需要在子表達式中使用兩條語句。否則,唯一發生的是$l遞增,但其值不被檢索。

  • 4

    我相信這是由PowerShell團隊做出的設計決策,以避免由於PowerShell輸出返回值而導致的意外。許多C/C#人會期望以下函數只輸出1而不是@(0,1)。

    function foo { 
        $i = 0 
        $i++ 
        $i 
    } 
    

    所以命題形式$i++做的$我不能輸出值遞增前。如果你想要的行爲,PowerShell允許通過直接把遞增(或遞減)語句表達例如爲:

    function foo { 
        $i = 0 
        ($i++) 
        $i 
    } 
    

    內獲得這種行爲這將輸出@(0,1)。

    Bruce Payette在Windows PowerShell in Action 2nd Edition的第5章中對此進行了討論。遞增和遞減操作符是「可撤銷的語句」。從書中引用:

    基本上,這意味着某些類型的表達式在用作 語句時不會顯示。無效的陳述包括分配 陳述和增量/減量運算符。當在表達式中使用遞增和遞減時,它們會返回一個值,但是當它們用作獨立語句時,它們不返回任何值。

    1

    這是因爲$l++不返回任何東西,:

    $l = 0 
    $l++ #nothing 
    $l #gives 1 
    $l++ #nothing 
    ($l++) #gives 2 
    

    這樣做的目的有是當你正在返回管道沒有混亂。實際上,

    $l++$l = $l+ 1,所以它不返回任何東西。

    你想看到的是$l = $l + 1; $l,這就是爲什麼你必須做($l++)

    相關問題