我在 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 文档示例并根据需要进行调整:
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()
我在这里挣扎。我不知道如何让按钮函数读取 $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 文档示例并根据需要进行调整:
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()