如何从PowerShell的Button.Add_Click代码块中获取变量?
PowerShell WinForms中提取选中打印机变量的解决方案
你的问题出在PowerShell的作用域规则:Add_Click绑定的脚本块会创建自己的局部作用域,里面定义的$selectedPrinter是局部变量,无法被外部脚本作用域访问。下面提供几种可行的解决方法:
方法1:直接在对话框关闭后读取ListBox的选中项(最简便)
既然$listBox是在脚本作用域中创建的,对话框关闭后该对象依然存在,完全可以跳过在点击事件中赋值的步骤,直接在ShowDialog()之后获取选中项:
# Load Windows Forms and drawing libraries Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # Create the form $form = New-Object System.Windows.Forms.Form $form.Text = 'Select a Printer' $form.Size = New-Object System.Drawing.Size(300,200) $form.StartPosition = 'CenterScreen' # Add a label $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point(10,10) $label.Size = New-Object System.Drawing.Size(280,20) $label.Text = 'Please select a printer:' $form.Controls.Add($label) # Add a list box $listBox = New-Object System.Windows.Forms.ListBox $listBox.Location = New-Object System.Drawing.Point(10,40) $listBox.Size = New-Object System.Drawing.Size(260,100) $form.Controls.Add($listBox) # Populate the list box with printer names $printers = Get-Printer | Select-Object -ExpandProperty Name foreach ($printer in $printers) { $listBox.Items.Add($printer) } # Add a button $button = New-Object System.Windows.Forms.Button $button.Location = New-Object System.Drawing.Point(10,150) $button.Size = New-Object System.Drawing.Size(100,20) $button.Text = 'OK' $form.Controls.Add($button) # 简化点击事件,只负责关闭窗口 $button.Add_Click({ $form.Close() }) # Show the form $form.Add_Shown({$form.Activate()}) [void] $form.ShowDialog() # 直接从ListBox获取选中项 $selectedPrinter = $listBox.SelectedItem # Output the selected printer if ($selectedPrinter) { Write-Host "Selected printer: $selectedPrinter" } else { Write-Host "No printer selected." } pause
方法2:使用脚本作用域修饰符
如果必须在点击事件中赋值,可以通过$script:前缀将变量声明为脚本作用域的变量,让外部作用域能够访问:
修改点击事件代码:
$button.Add_Click({ $script:selectedPrinter = $listBox.SelectedItem $form.Close() })
这样外部的$selectedPrinter就能获取到点击事件中赋值的内容。
方法3:使用引用类型传递(哈希表/自定义对象)
引用类型的变量在不同作用域间共享内存地址,因此可以在外部定义一个哈希表,在点击事件中修改其值:
# 先在外部定义一个哈希表 $selectedPrinter = @{} # 修改点击事件 $button.Add_Click({ $selectedPrinter.Value = $listBox.SelectedItem $form.Close() }) # 后续访问时取Value属性 if ($selectedPrinter.Value) { Write-Host "Selected printer: $($selectedPrinter.Value)" } else { Write-Host "No printer selected." }
以上三种方法都能解决你的问题,其中方法1是最直接且简洁的方案。
内容的提问来源于stack exchange,提问作者emendelson
相关产品推荐
相关产品推荐

