我正在创建一个PowerShell函数,用于使用GUI在AD中搜索用户。该函数将ShowDialog()一个Windows窗体供用户进行搜索,然后当用户单击OK时窗体关闭,函数将返回一个包含所选AD用户的ArrayList。
在表单关闭之前,一切正常。表单关闭后,我的ArrayList突然计数为0,而不是包含他们选择的AD用户。
我无法理解为什么ArrayList($ alRetrievedSelection)被清空了。我实际上只有一行代码可以修改这个ArrayList。其他一切只是我自己的调试目的的写警告。
#This function returns an arraylist that contains the items selected by the user
function Retrieve-DataGridSelection{...}
#Fake sample data
$array = "Item 1","Item 2","Item 3","Item 4"
$arraylist = New-Object System.Collections.ArrayList(,$array)
#Create the basic form
$frmWindow = New-Object System.Windows.Forms.Form
#Create the OK button
$btnOK = New-Object System.Windows.Forms.Button
$btnOK.Add_Click({
$alRetrievedSelection = Retrieve-DataGridSelection -dgDataGridView $datagrid
#This warning always shows the correct Count
Write-Warning("Received from Retrieve-DataGridSelection: " + $alRetrievedSelection.Count)
})
$frmWindow.Controls.Add($btnOK)
#Create the datagrid where users will select rows
$datagrid = New-object System.Windows.Forms.DataGridView
$datagrid.DataSource = $arraylist
$frmWindow.Controls.Add($datagrid)
#Give focus to the form
$frmWindow.Add_Shown({$frmWindow.Activate()})
#Display the form on the screen
$frmWindow.ShowDialog()
#This warning keeps telling me the Count is 0 when it should not be
Write-Warning("After the form closes: " + $alRetrievedSelection.Count)
答案 0 :(得分:0)
这是由于PS的范围规则。来自Get-Help about_Scopes
:
[我] tems你创造和改变 除非您明确说明,否则在子范围内不会影响父范围 在创建项目时指定范围。
这意味着当您在Click
处理程序脚本块(相当于C#lambda)中设置变量时,只能在该块的本地范围内设置它,而不是全局范围。
要在全局范围内设置变量,请使用global
范围修饰符:
$global:alRetrievedSelection = Retrieve-DataGridSelection …