如何用定界符合并和分割值?

时间:2019-07-29 22:01:41

标签: powershell

我有一个脚本,其中有一个开关-Add,允许一次在数据库中添加1个角色和1个成员(成为该角色)。

PS> script1.ps1 -Add Database1 role1 member1
PS> script1.ps1 -Add Database1 role1 member2
PS> script1.ps1 -Add Database1 role2 memberx
PS> script1.ps1 -Add Database1 role3
PS> script1.ps1 -Add Database1 role4 membery

如果要添加一个时间的成员多于1个或1个角色/成员,则每次都必须运行该脚本是不切实际的。因此,我想一次 批量添加角色/成员 来更新我的脚本,这尤其对用户不会使用的TFS用例特别有用。必须创建多个版本才能为同一数据库添加几个角色/成员。

我正在考虑实现定界符拆分,其中每个分号都表示一个新角色的开始,而逗号分隔的成员都属于一个角色,除非后跟分号(如果分号结尾则不必输入,除非使用正则表达式很难实现类似的功能?)

伪代码:

$RoleInput.Split(";") | ForEach { 

    $role = "$_";

    $MemberInput.Split(",") | ForEach { 

        $member = "$_";

        #-Add $DBName $role $member

    }
}

最后,我想达到以下目标:

PS> script1.ps1 -Add Database1 role1;role2;role3;role4 member1,member2;memberx;;membery

这意味着对于role1, member1 and member2 would be added role2, memberx is addedfor role3, no member is addedfor role 4, membery is added

我如何使用正则表达式正确解决此问题,以解决空格和输入结束?

1 个答案:

答案 0 :(得分:1)

将角色和成员保存为CSV

"Role","Members"
"role1","member1;member2"
"role2",
"role3","memberX"

然后使用Import-Csv加载CSV,在选定的辅助定界符(上例中的分号)处拆分成员列表,然后使用这些参数调用脚本。

Import-Csv 'input.csv' | ForEach-Object {
    $role = $_.Role
    if ($_.Members) {
        $_.Members -split ';' | ForEach-Object { & script1.ps1 -Add $role $_ }
    } else {
        & script1.ps1 -Add $role
    }
}

如果您可以修改脚本的parameters,则可以将其更改为以下内容:

[CmdletBinding()]
Param(
    [Parameter(ParameterSetName='add', Mandatory=$true)]
    [Switch]$Add,

    [Parameter(ParameterSetName='add', Mandatory=$true)]
    [String]$Role,

    [Parameter(ParameterSetName='add', Mandatory=$false)]
    [String[]]$Members = @()
)

,以便脚本通过命名参数接受成员列表(当然,您还需要调整在脚本中处理成员的方式),然后像这样调用它:

Import-Csv 'input.csv' | ForEach-Object {
    $params = @{'Role' = $_.Role}
    if ($_.Members) { $params['Member'] = $_.Members -split ';' }
    & script.ps1 -Add @params
}

第二个示例使用splatting将参数传递到脚本。