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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:35:17