#powershell #csv
#powershell #csv
Вопрос:
У меня есть список пользователей, и я хочу экспортировать имена их групп, отсортированные по алфавиту. Следующий сценарий не работает во внутреннем ForEach-Object
цикле.
Get-Content users.txt | ForEach-Object {
$user = $_;
Get-ADUser –Identity $user –Properties MemberOf | Select-Object -ExpandProperty MemberOf | sort
ForEach-Object {
New-Object PSObject -property @{User=$user;Group=$_;}
}
} | Export-Csv -Path 'your_file_path.csv' -NoTypeInformation
Комментарии:
1. Какова цель улучшения? Удобочитаемость? Эффективность процессора? Эффективность использования памяти? Скорость? Обработка ошибок?
2. Я думаю, «заставить это работать», потому что вложенный
foreach-object
файл не имеет ввода.3. Тогда вам нужно уточнить вопрос, чтобы читатели знали, что вам нужно.
4. @Tony Hinkle Извините, ребята. Мой пост был отредактирован супер-администратором. Я новичок в powershell!. У меня есть список пользователей, я хочу отсортировать членство в группах пользователей по алфавиту, а затем экспортировать только имена членов их групп. Этот скрипт экспортирует CH # Плюс подразделение и т. Д. И т. Д. Как я могу улучшить скрипт, пожалуйста?
5. @TessellatingHeckler Извините
Ответ №1:
ForEach-Object просто сидит там один — вам нужно либо передать ему объект, либо присвоить объект переменной и использовать foreach
вместо этого цикл по объекту. Я выбрал второй подход, приведенный ниже, поскольку чрезмерное количество каналов затрудняет чтение сценариев (для меня).
Get-Content c:tempusers.txt | ForEach-Object {
$user = $_;
$AdUser = Get-ADUser –Identity $user –Properties MemberOf | Select-Object -ExpandProperty MemberOf | get-adgroup | select -ExpandProperty Name | sort
foreach($group in $AdUser) {
New-Object PSObject -property @{User=$user;Group=$group;} | Export-Csv -Path 'c:tempout.csv' -NoTypeInformation -Append
}
}
…и если вы хотите передать его и использовать ForEach-Object
, вам просто нужно поместить канал после sort
и переместить Export-Csv
, чтобы он экспортировал новый созданный объект:
Get-Content c:tempusers.txt | ForEach-Object {
$user = $_;
Get-ADUser –Identity $user –Properties MemberOf | Select-Object -ExpandProperty MemberOf | get-adgroup | select -ExpandProperty Name | sort |
ForEach-Object {
New-Object PSObject -property @{User=$user;Group=$_;} | Export-Csv -Path 'c:tempout.csv' -NoTypeInformation -Append
}
}
Комментарии:
1. ханкл — Большое спасибо за ответ. У меня есть список пользователей, я хочу сортировать имена участников каждой группы пользователей только по алфавиту, а затем экспортировать только имена членов их групп. Этот скрипт экспортирует CH # Плюс подразделение и т. Д. И т. Д. Как я могу улучшить скрипт, пожалуйста? Спасибо
2. @kbriaz Я обновил ответ, чтобы выходные данные включали только имена групп, а не различимые имена.
3. Большое спасибо. Скрипт работает как по волшебству, он экспортирует имена всех групп пользователей в списке. Однако в окне PowerShell я получаю следующую ошибку. (get-adgroup: не удается найти объект с идентификатором: ‘CN = #XXX Великобритания Все (1), OU = XXX группы, OU = XXX группы, DC = XXX, DC = XXX, DC = XX’ в разделе: ‘DC = XX, DC = XXX, DC =XXX’) Есть идеи, почему это? Должен ли я просто игнорировать это? Поскольку экспорт содержит данные, которые мне нужны. Извините за беспокойство и еще раз спасибо за помощь. Ta
4. Я понятия не имею, почему это вызвало бы эту ошибку. Передача отличительного имени является допустимым вводом для get-adgroup ( technet.microsoft.com/en-us/library /… )