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

从窗体GridView选中单元格获取设备执行Ping操作时出错

问题修复方案

核心问题分析

  1. $Computers格式错误:$datagridview1.SelectedCells.Value返回的不是标准数组——当只选中单个单元格时,它是单个字符串而非数组;如果选中多列单元格,还会混入非主机名的数据。
  2. 数组拼接失败:当Ping全失败时,$Success是$null;当Ping只有一个成功时,$Success是单个PSObject,和$Failed数组直接用+拼接时会触发类型不匹配错误。

修复后的代码

# 1. 正确提取选中的主机名:筛选主机名列(替换成你的GridView中主机名对应的列名,比如"HostName"),去重并转为数组
$targetColumnName = "HostName" # 替换为实际的主机名列名称
$Computers = $datagridview1.SelectedCells | 
    Where-Object { $_.OwningColumn.Name -eq $targetColumnName } | 
    Select-Object -ExpandProperty Value -Unique |
    Where-Object { $_ -ne $null -and $_ -ne "" } # 过滤空值

# 2. 执行Ping测试
$Success = Test-Connection -ComputerName $Computers -Count 1 -ErrorAction SilentlyContinue -ErrorVariable errors | 
    Select-Object @{ Name = "Computer"; Expression = { $_.Address } }, IPv4Address,
                  @{ Name = "Result"; Expression = { 'Success' } }
        
$Failed = $Errors.Exception.Message | 
    Where-Object { $_ -match "Computer '(.+?)'" } |
    Select-Object @{ Name = "Computer"; Expression = { $Matches.1 } },
                  @{ Name = "IPv4Address"; Expression = { "N/A" } },
                  @{ Name = "Result"; Expression = { 'Failed' } }   

# 3. 确保两边都是数组再拼接,避免类型错误
@($Success) + @($Failed) | Out-GridView -Title 'Ping Status'

关键改动说明

  • 主机名提取逻辑:
    • 通过OwningColumn.Name筛选出仅主机名列的选中单元格,避免混入其他列数据
    • 用-Unique去重,避免重复Ping同一台机器
    • 过滤空值,防止无效的Ping请求
  • 数组强制转换:
    • 用@()包裹$Success和$Failed,无论结果是单个对象、多个对象还是$null,都会被转为数组,确保+拼接操作正常执行

内容的提问来源于stack exchange,提问作者William

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:12:51