PowerShell中如何将YAML读取的字符串值作为对象添加到数组?
问题原因与解决方法
你的问题出在数组初始化方式错误:$role1_servers,$role2_servers = @() 这种赋值逻辑是将空数组的元素依次分配给两个变量,但空数组没有元素,所以$role2_servers会被赋值为$null。当对$null变量执行+=操作时,PowerShell会自动将其转换为字符串类型,多次添加就变成了字符串拼接。
修正方案1:正确初始化数组
分别为每个变量单独初始化空数组,再执行原有逻辑:
# 单独初始化两个空数组 $role1_servers = @() $role2_servers = @() $config.hosts | ForEach-Object { $server_name = $_.name $_.role | ForEach-Object { switch($_){ "role1" { $role1_servers += $server_name } "role2" { $role2_servers += $server_name } } } }
修正方案2:更高效的筛选写法
PowerShell中可以直接用Where-Object筛选符合角色的服务器,避免循环内频繁修改数组(数组是不可变类型,+=会创建新数组,数据量大时性能较差):
$role1_servers = $config.hosts | Where-Object { $_.role -contains "role1" } | Select-Object -ExpandProperty name $role2_servers = $config.hosts | Where-Object { $_.role -contains "role2" } | Select-Object -ExpandProperty name
执行后$role1_servers会是包含server1、server2的数组,$role2_servers包含server3,后续可以直接遍历使用。
内容的提问来源于stack exchange,提问作者peterbonar
相关产品推荐
相关产品推荐

