Предположим, у меня есть файл csv следующим образом:
role member
role1 memberA
role1 memberB
role2 memberC
role3 memberX
role3 memberY
role3 memberC
Я хочу добавить в базу данных всех участников ролей в базе данных
$csvR = (Import-Csv $csvFile).role
foreach ($Role in $csvR)
{
foreach ($Member in $Role)
{
& ".\AddMembers.ps1" -AddtoDatabaseOnOneServer "$Role" "$Member" "$DatabaseName" "$ServerInput"
}
}
Будет ли этот цикл распознавать, например, добавление участника A в роль 1, участника B в роль 1, участника C в роль 2 и т. д.? другими словами, правильный ли этот внутренний цикл: foreach ($Member in $Role)
взгляните на справку по командлету Group-Object. он может группировать объекты из вашего Import-CSV по свойству .Role, а затем вы можете перебирать полученные группы, чтобы назначить .Member.Role.
@Lee_Dailey, допустим, я делаю так: Import-Csv "E:\foo.csv"| Роль группового объекта, член. как присвоить значения? и после присвоения значений, как мне использовать его в цикле?
@Cataster - посмотрите, что у вас есть после того, как вы сохраните сгруппированные данные в $Var. это будет массив объектов, и у каждого будет .Group, в котором есть все соответствующие объекты из импорта CSV. вы можете повторить это ... [ухмылка] ///// если вы замените эту неприятную, неприглядную картинку бесполезный ваших выборочных данных несколькими строками из вашего источника, я мог бы сделать демонстрацию этой идеи. я не буду беспокоиться, если вы не опубликуете полезные образцы данных, хотя. [хмуриться]
Вы можете просто выполнить один цикл и получить доступ к ролям и членам как к свойствам: $csvR = Import-Csv $csvFile; foreach ($row in $csvR) { $row.role; $row.member }. Если ваш скрипт AddMembers.ps1 принимает только одну роль и одного члена в качестве параметра, вы будете выполнять своего рода итерацию.
@Lee_Dailey так нравится? $Var = Select-Object @{Name='Role' ;Expression = {$_.Values[0]}}, @{Name='Members';Expression = {$_.Values[1]}}
@Lee_Dailey только что вставил их в свой пост :)
@AdminOfThings да, мой скрипт AddMembers.ps1 принимает только одну роль и одного члена в качестве параметра
@Cataster - я добавил ответ, который показывает, что я имею в виду о том, как использовать Group-Object для того, к чему вы, кажется, стремитесь.





вот демонстрация того, как использовать командлет Group-Object для перебора элементов в импортированном файле CSV по сгруппированному свойству. [ухмылка]
в строке give person вы можете либо добавить свой звонок в свой сценарий для каждого человека, либо собрать имена всех людей для этого .Role и добавить их всех сразу.
# fake reading in a CSV file
# in real life, use Import-CSV
$InStuff = @'
role, member
role1, memberA
role1, memberB
role2, memberC
role3, memberX
role3, memberY
role3, memberC
'@ | ConvertFrom-Csv
$GroupedIS = $InStuff |
Group-Object -Property Role
foreach ($GIS_Item in $GroupedIS)
{
foreach ($GG_Item in $GIS_Item.Group)
{
'give person [ {0} ] the role [ {1} ]' -f $GG_Item.Member, $GG_Item.Role
}
}
выход ...
give person [ memberA ] the role [ role1 ]
give person [ memberB ] the role [ role1 ]
give person [ memberC ] the role [ role2 ]
give person [ memberX ] the role [ role3 ]
give person [ memberY ] the role [ role3 ]
give person [ memberC ] the role [ role3 ]
прикольно, пробую!
@Cataster - это действительно отличный командлет ... и вы можете группировать по нескольким свойствам ... и вы также используете вычисляемые свойства. [ухмылка]
@Cataster - добро пожаловать! рад, что помог... [ухмылка]
Ты это пробовал? Объекты, выводимые
Import-Csv, представляют каждую строку входного CSV со свойствомStringдля каждого столбца. Он не собирается создавать какие-либо коллекции или выполнять какие-либо дальнейшие интерпретации/ассоциации, если вы не дадите ему указание. Кроме того, установив$csvRв.role, вы убираете свойствоRoleи отбрасываете остальную часть объекта.