powershell - 如何组合字符串输入并动态生成数组?

标签 powershell

param([string]$roles,[string]$members)

假设我在这样的命令行上传递输入
PS> role1,role2,role3,role4 member1,member2,,,,member3,,member4

我期望的数组是:
$array = @(
    @('role1', 'member1,member2'),
    @('role2', ''),
    @('role3', 'member3'),
    @('role4', 'member4')
)

我知道将字符串转换为数组:
$roles = 'role1,role2,role3,role4' -split ','
$members = 'member1,member2,,,,member3,,member4' -split ',,'

现在如何将$roles$members结合在一起,以便每个角色都与成员相关联?我将如何动态生成数组?

伪代码:
$array = @()

($roles+$members) | %{
    $role = $_.roles
    if ($_.members) {
        $_.members -split ',,' | ForEach-Object { $array += $role $_ }
    } else {
        $array += $role 
    }
}

请注意:我正在将成员拆分为每个双逗号的索引,因为显然分号arent在命令行上被接受是因为它们破坏了命令行,所以我必须使用双逗号作为定界符

注2 :请注意4个逗号:,,,,这表明role2没有要添加的成员,因此从本质上讲,这意味着在4个逗号之间没有该索引/项目(role2)成员的输入,即,空,

最佳答案

如果您确实想坚持使用此参数格式,则可以按如下所示创建所需的输出数组:

$roles = 'role1,role2,role3,role4' -split ','
$members = 'member1,member2,,,,member3,,member4' -split ',,'

$i = 0
$array = @(foreach ($role in $roles) {
  , ($role, $members[$i++])
})

请注意,如果您从PowerShell传递参数,则需要引用它们,因为PowerShell会将它们解析为数组。

通过引用,您可以自由使用;代替,,来分隔成员组。

表示参数数据以供以后处理的更好方法是创建一个自定义对象数组,而不是一个嵌套数组:
$roles = 'role1,role2,role3,role4' -split ','
$members = 'member1,member2,,,,member3,,member4' -split ',,'

$i = 0
$array = @(foreach ($role in $roles) {
   [pscustomobject] @{
     Role = $role
     Members = $members[$i++] -split ','
   }
})

现在$array中的每个对象都有一个.Role.Members属性,后者包含作为字符串数组的各个成员。

或者,您可以从输入中创建一个[n有序]哈希表,并按角色名称键入,但这仅在需要按名称访问角色或要排除已指定的重复角色时才需要。

这是一种更容易理解的替代参数格式:
$rolesAndMembers = 'role1 = member1,member2 ; role2= ; role3=member3 ; role4=member4'

$array = @(foreach ($roleAndMembers in ($rolesAndMembers -replace ' ' -split ';')) {
  $role, $members = $roleAndMembers -split '='
  [pscustomobject] @{
    Role = $role
    Members = $members -split ','
  }
})

关于powershell - 如何组合字符串输入并动态生成数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57279715/

相关文章:

unit-testing - 如何在 *n* 个测试失败后停止 MsTest 测试执行

powershell - 在 PowerShell 1.0 版中解析模拟 "grep -C 2"

powershell - Foreach 盘符数组

linux - 在 powershell linux 上更改参数的颜色

powershell - 为什么 Powershell 在我导入私钥后将其删除?

powershell - 使用 PowerShell 将文件预挂到目录和子目录中的所有 .cs 文件

powershell - 为什么单元素哈希表在 powershell 中的行为不同?

django - 等效于 PowerShell 中的 Bash 别名

powershell - Azure Powershell 失败并出现模糊错误 : One or more errors occurred

Powershell 写入错误不会填充 -ErrorVariable