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/