PowerShell硬编码IP与从ini文件读取IP遍历效果不一致问题
问题根因
两种赋值方式的$IP变量类型完全不同,Write-Host输出结果一致只是PowerShell的默认显示规则导致的假象:
- 硬编码写法
$IP= '10.10.10.1', '10.10.10.2', '10.10.10.3'生成的是字符串数组(类型为System.String[]),包含3个独立的IP元素,ForEach-Object遍历时会逐个取出单个IP传入检测逻辑,因此运行正常。 - 从ini文件读取到的配置值是单个连续字符串(类型为
System.String),内容为整串"10.10.10.1 10.10.10.2 10.10.10.3",ForEach-Object遍历单个字符串时只会将整串作为一个对象传入,不会自动按空格拆分IP,因此执行异常。
另外你的ini解析代码本身存在变量名笔误:初始化哈希表时定义的变量是$config,后续添加键值时误写为$configs,直接运行会触发变量未定义的报错。
修正方案
- 修复ini解析逻辑的变量名笔误
- 读取到IP配置项后,按空白字符将单条字符串拆分为独立的IP数组,过滤可能存在的空值后再执行遍历检测
修正后的完整可运行代码如下:
# 解析ini配置文件 Get-Content config.ini | ForEach-Object -Begin {$config=@{}} -Process { $store = [regex]::Split($_, '=') if( ($store[0].CompareTo("") -ne 0) -and (-not $store[0].StartsWith("[")) -and (-not $store[0].StartsWith("#")) ) { $config.Add($store[0], $store[1]) } } # 读取IP配置,按任意空白字符拆分数组,过滤空项 $IP = $config["IP"] -split '\s+' | Where-Object { $_ } # 连通性检测+DataGridView写入逻辑 $IP | ForEach-Object { $result = TestConnection $_ -count 1 -Quiet $DataGridView.Rows.Add($_, $result) }
补充说明:
-split '\s+'支持适配IP之间的单空格、多空格、制表符等多种分隔场景,后续如果ini里的IP改用逗号分隔,只需要把拆分规则改成-split ',\s*'即可适配。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

