2015-06-29 59 views
2

所以我很難與這方面的文獻。我希望有人能夠在這裏解釋不同之處,以便更好地理解我的腳本流程。Powershell V2 vs V4作用域差異

袒護我,我自學成才。

function select-bin { 
    $objForm = New-Object System.Windows.Forms.Form 
    $objForm.Text = "Select a Bin" 
    $objForm.Size = New-Object System.Drawing.Size(300,200) 
    $objForm.StartPosition = "CenterScreen" 

    $x = @() 

    # Create $OKButton and $objListBox ... removed code as not relevant. 

    $OKButton.Add_Click({ 
     $x+=$objListBox.SelectedItems 
     $objForm.Close() 
    }) 

    $objForm.ShowDialog() 
    if ($x) { 
     return $x 
    } 
    else { 
     return $null 
    } 
} 

在上面的代碼示例中,它在Powershell V2中很好用,但是在V4中,add_click部分不起作用。它成功關閉了表單(在函數作用域中創建),但未能更新$ x。

所以我想這裏是我的問題。

  1. 在V2中,是否將add_click部分視爲與函數相同的作用域? (唯一的辦法是我看到它已經能夠更新$ x)
  2. 有什麼事情像這種改變數據的正確方法是什麼?我覺得在全局範圍內聲明$ x有點多餘,因爲我只需要它在函數中。
  3. 在V4中,add_click運行的範圍是什麼?它與V2中的內容明顯不同,但它是否在全球運行?它是相對於$ OKButton還是函數?我假設它是全球性或功能性的孩子,但我真的不知道。

任何人都可以提供的任何清晰度將不勝感激。在我的公司遷移到V4之前,我有很多更新要做,因爲我沒有遵循範圍最佳實踐(我的不好)。

回答

1

在V2中,一個ScriptBlock在轉換爲一個委託的時候,會運行在任何作用域爲當前作用域的地方。

通常,這是創建腳本塊的範圍,所以事情很自然。但在某些情況下,它的運行範圍與創建的範圍無關。

在V4中,這些腳本塊在其自己的作用域中運行 - 新作用域是當前作用域的子作用域,只是因爲他們是一個函數,你通常調用的函數(不點採購。)

我認爲最好的方法是使用下面的(大致從最好到最差)中的一個:

  • $腳本:x
  • $ x =獲得變量-Scope 1 -Name x
  • $ global:x