从窗体GridView选中单元格获取设备执行Ping操作时出错
问题修复方案
核心问题分析
- $Computers格式错误:
$datagridview1.SelectedCells.Value返回的不是标准数组——当只选中单个单元格时,它是单个字符串而非数组;如果选中多列单元格,还会混入非主机名的数据。 - 数组拼接失败:当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
相关产品推荐
相关产品推荐

