You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:40:00