将从YAML文件转换的字符串值作为对象添加到PowerShell数组

zysjyyx4  于 2022-12-23  发布在  Shell
关注(0)|答案(2)|浏览(151)

我有一个从中读取值的YAML配置文件,其结构如下:

hosts:
  - name: server1
    role: 
      - role1
    services:
      - iis
      - sql
  - name: server2
    role: 
      - role1
      - role4
    services:
      - iis
  - name: server3
    role:
      - role2
    services:
      - sql_server

我从PowerShell脚本中读取这个YAML配置文件,并将配置存储在名为$config的变量中
我创建了空数组,然后遍历主机列表,并根据角色存储在相应的数组中,如下所示:

$role1_servers,$role2_servers = @()
$config.hosts |  % {
    $server_name = $_.name
    $_.role | % {
        switch($_){
            "role1" {
                $role1_servers+= $server_name
            }
            "role2" {
                $role2_servers+= $server_name
            }
        }
    }
}

但是PowerShell不是将值添加到相关数组,而是执行字符串连接,而不是将项添加到数组。
例如,当输出$role1_servers时,它将输出

server1server2

而不是期望的输出

server1
server2

有没有办法将字符串值作为对象添加到数组中,而不是字符串连接?我需要数组中的这些项,以便在稍后阶段迭代特定角色中的所有服务器。

mznpcxlj

mznpcxlj1#

继续我们的评论,我认为最好的方法是创建一个对象数组,其中所有服务器名称和角色都是这样显示的:

$allServers = $config.hosts | ForEach-Object {
    $server = $_.name
    foreach ($role in $_.role) {
        [PsCustomObject]@{
            Server = $server
            Role   = $role
        }
    }
}

现在,您可以筛选出具有特定角色的所有服务器

$role1_servers = $allServers | Where-Object { $_.role -eq 'role1' }
$role2_servers = $allServers | Where-Object { $_.role -eq 'role2' }

# etc.
xdnvmnnf

xdnvmnnf2#

您可以考虑使用PS Gallery中现成的模块来处理YAML。

install-module powershell-yaml

$hosts = @'
hosts:
  - name: server1
    role: 
      - role1
    services:
      - iis
      - sql
  - name: server2
    role: 
      - role1
      - role4
    services:
      - iis
  - name: server3
    role:
      - role2
    services:
      - sql_server
'@ | ConvertFrom-Yaml | ConvertTo-Json | ConvertFrom-Json

现在,您可以过滤要查找的值

$hosts.hosts | where role -like '*role1*'

name    services role
----    -------- ----
server1 iis sql  role1
server2 iis      role1 role4

相关问题