我在 gui powershell 中遇到按钮功能问题

Im having promlen with button functions in gui powershell

我在这里挣扎。我不知道如何让按钮函数读取 $listbox1.selectedItems 和 $listbox2.selectedItem 这里有什么问题吗? 如果我在按下确定按钮后尝试查看 $listbox 项目,它会显示但如果我调用功能按钮则不会,我删除了一些不必要的代码部分。

$form = New-Object System.Windows.Forms.Form
$form.StartPosition = 'CenterScreen'

$button1 = New-Object System.Windows.Forms.Button
$button1.Text = 'Link'

$button2 = New-Object System.Windows.Forms.Button
$button2.Text = 'UnLink'

$button3 = New-Object System.Windows.Forms.Button
$button3.Text = 'ShowGPOlink'

$button4 = New-Object System.Windows.Forms.Button
$button4.Text = 'ShowOUlink'

#OK Button
$button5 = New-Object System.Windows.Forms.Button
$button5.Text = 'Done'
$button5.DialogResult = [System.Windows.Forms.DialogResult]::OK

$listBox1 = New-Object System.Windows.Forms.ListBox
$listbox1.SelectionMode = 'MultiExtended'

$listBox2 = New-Object System.Windows.Forms.ListBox

[void] $listBox1.Items.addRange($GPOLIST)
[void] $listBox2.Items.Addrange($OUHOLDER.CanonicalName)

$form.Controls.Add(...)
$form.AcceptButton = $button5

$button1.Add_Click({ LinkFn })
$button2.Add_Click({ UnLinkFn })
$button3.Add_Click({ ShowGPO })
$button4.Add_Click({ ShowOU })

function LinkFn {
#for some reason it returns nothing
$listBox1.selecteditems
$listbox2.SelectedItem 
Write-Host "function link"
}
$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK){ 
$listBox1.selecteditems
$listbox2.SelectedItem  }

您为什么不利用提供的 PowerShell 文档示例并根据需要进行调整:

Selecting Items from a List Box

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Select a Computer'
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = 'CenterScreen'

$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,120)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)

$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(150,120)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Please select a computer:'
$form.Controls.Add($label)

$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(10,40)
$listBox.Size = New-Object System.Drawing.Size(260,20)
$listBox.Height = 80

[void] $listBox.Items.Add('atl-dc-001')
[void] $listBox.Items.Add('atl-dc-002')
[void] $listBox.Items.Add('atl-dc-003')
[void] $listBox.Items.Add('atl-dc-004')
[void] $listBox.Items.Add('atl-dc-005')
[void] $listBox.Items.Add('atl-dc-006')
[void] $listBox.Items.Add('atl-dc-007')

$form.Controls.Add($listBox)

$form.Topmost = $true

$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    $x = $listBox.SelectedItem
    $x
}

如果您定义了 Multiselect,则将块更改为此...

$listBox.SelectionMode = 'MultiExtended'  


if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    ForEach ($ListItem in $listBox.SelectedItems)
    {$ListItem}
}

因此,正如我所说,这需要我实际重写您在这里的内容,以解释并向您展示您将要查看的内容。这将显示带有预填充列表的格式化 GUI,当您从 listbox1 中选择单个或多个 select 和项目时,单击 Link 按钮,这会触发函数 LinkFn,它会将 selection 复制到 Listbox2 并且不会关闭表单。

下面的代码与 PS 帮助中显示的内容没有任何不同,只是将结果发送到另一个 GUI 元素,并且不通过默认的 OK return 关闭表单。所有这些在 GUI 设计中都是常见的事情。

#region Begin environment initialization

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

#endregion Begin environment initialization


#region Begin functions and code behind

function DoneFn { }
function ShowModuleFn { }
function ShowProcessFn { }
function UnLinkFn { }
function LinkFn 
{ 
    $listBox1.selecteditems
    # $listbox2.SelectedItems
    [void] $listBox2.Items.Addrange($listBox1.selecteditems)
}

$List1 = (Get-Process).Name
# $List2 = (Get-Module).Name

#endregion End functions and code behind


#region Begin  GUI code
$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '634,339'
$Form.text                       = 'Form'
$Form.TopMost                    = $false

$ListBox1                        = New-Object system.Windows.Forms.ListBox
$ListBox1.text                   = 'listBox1'
$listBox1.SelectionMode          = 'MultiExtended'
$ListBox1.width                  = 269
$ListBox1.height                 = 176
$ListBox1.location               = New-Object System.Drawing.Point(17,21)

$ListBox2                        = New-Object system.Windows.Forms.ListBox
$ListBox2.text                   = 'listBox2'
$listBox2.SelectionMode          = 'MultiExtended'
$ListBox2.width                  = 300
$ListBox2.height                 = 175
$ListBox2.location               = New-Object System.Drawing.Point(318,21)

$Button1                         = New-Object system.Windows.Forms.Button
$Button1.text                    = 'Link'
$Button1.width                   = 60
$Button1.height                  = 30
$Button1.location                = New-Object System.Drawing.Point(20,238)
$Button1.Font                    = 'Microsoft Sans Serif,10'

$Button2                         = New-Object system.Windows.Forms.Button
$Button2.text                    = 'Unlink'
$Button2.width                   = 60
$Button2.height                  = 30
$Button2.location                = New-Object System.Drawing.Point(127,241)
$Button2.Font                    = 'Microsoft Sans Serif,10'

$Button3                         = New-Object system.Windows.Forms.Button
$Button3.text                    = 'ShowProcess'
$Button3.width                   = 88
$Button3.height                  = 30
$Button3.location                = New-Object System.Drawing.Point(20,297)
$Button3.Font                    = 'Microsoft Sans Serif,10'

$Button4                         = New-Object system.Windows.Forms.Button
$Button4.text                    = 'ShowModules'
$Button4.width                   = 105
$Button4.height                  = 30
$Button4.location                = New-Object System.Drawing.Point(127,297)
$Button4.Font                    = 'Microsoft Sans Serif,10'

$Button5                         = New-Object system.Windows.Forms.Button
$Button5.text                    = 'Done'
$Button5.width                   = 60
$Button5.height                  = 30
$Button5.location                = New-Object System.Drawing.Point(556,298)
$Button5.Font                    = 'Microsoft Sans Serif,10'

$Form.controls.AddRange(@(
    $ListBox1,
    $ListBox2,
    $Button1,
    $Button2,
    $Button3,
    $Button4,
    $Button5
))

$Button1.Add_Click({ LinkFn })
$Button2.Add_Click({ UnLinkFn })
$Button3.Add_Click({ ShowProcessFn })
$Button4.Add_Click({ ShowModuleFn })
$Button5.Add_Click({ DondFn })

[void] $listBox1.Items.addRange($List1)
# [void] $listBox2.Items.Addrange($List2)

#endregion End GUI code

# Call the GUI
[void]$Form.ShowDialog()