PowerShell WinForm脚本下拉选择无法获取ComboBox选中值
PowerShell ComboBox选中值无法传递给Ping命令问题修复
问题现象
编写的带图形界面的PowerShell Ping脚本,已实现ComboBox下拉框加载E:\IP.txt内的IP地址列表,但点击PING按钮执行操作时,无法获取下拉框选中的正确IP,导致ping命令无法传入正确目标参数。
附IP文件输入示例:
Text file input
故障原因
- 原代码在下拉框选择变化事件里定义的
$selected是局部变量,作用域仅限该事件内部,PING函数读不到这个变量 - 下拉框初始化默认选中第一项时不会触发选择变化事件,就算手动选过IP,跨脚本块的局部变量也没法被PING函数正常调用。
修复后完整代码
直接在PING函数执行时实时读取下拉框当前选中值即可,彻底避免跨作用域变量调用问题,代码如下:
Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $Form1 = New-Object system.Windows.Forms.Form $Form1.ClientSize = '600,450' $Form1.text = "PowerShell GUI Example" $Form1.BackColor = "#ffffff" $List = New-Object system.Windows.Forms.ComboBox $List.text = "" $List.width = 170 $List.autosize = $true # 加载IP.txt内的IP到下拉框 [array]$result = (Get-Content E:\IP.txt) $result | ForEach-Object {[void] $List.Items.Add($_)} # 设置默认选中第一项 $List.SelectedIndex = 0 $List.location = New-Object System.Drawing.Point(70,100) $List.Font = 'Microsoft Sans Serif,10' $Form1.Controls.Add($List) # 添加PING按钮 $Button = New-Object System.Windows.Forms.Button $Button.Location = New-Object System.Drawing.Size(10,10) $Button.Size = New-Object System.Drawing.Size(100,40) $Button.Text = "PING" # 绑定按钮点击事件 $Button.Add_Click( { PING } ) $Form1.Controls.Add($Button) # Ping功能函数 function PING { # 实时读取下拉框当前选中的IP,避免作用域问题 $targetIP = $List.SelectedItem Ping.exe -t $targetIP | ForEach-Object {"{0} - {1}" -f (Get-Date),$_} | Tee-Object E:\ping.txt -Append | Out-GridView -Title 'PING' } # 弹窗显示窗体 [void]$Form1.ShowDialog()
可选优化点
- 可增加
E:\IP.txt文件存在性校验,避免文件丢失导致脚本加载报错 - 可增加停止Ping的按钮,默认
ping -t为持续运行状态,关闭Out-GridView窗口即可终止对应进程
内容的提问来源于stack exchange,提问作者Arunkumar
相关产品推荐
相关产品推荐

