我有一个脚本,其中有一个开关-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 added
,for role3, no member is added
和for role 4, membery is added
我如何使用正则表达式正确解决此问题,以解决空格和输入结束?
答案 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将参数传递到脚本。