В PowerShell, как я могу объединить результаты двух команд, которые имеют 1-к-1 relashionhip?

Вопрос:

Этот конкретный пример – Get-User и Get-Mailbox (Exchange 2010). Get-User возвращает некоторые из столбцов, которые мне нужны, и Get-Mailbox – некоторые другие. Мне трудно понять, как я могу объединить результаты этих двух в одну таблицу с результатами обоих.

Get-User -Filter "..." | Get-Mailbox -Filter "..."

Как взять результаты команды, аналогичной приведенной выше, и превратить ее в результаты, похожие на ниже?

FirstName  LastName  Alias   CustomAttribute1
---------  --------  ------  ----------------
Bob        Smith     bsmith  Example
Johnny     NoMail
Adam       Blye      ablye   Has a Mailbox

Обратите внимание, что FirstName и LastName не возвращаются Get-Mailbox, и, наоборот, Alias ​​и CustomAttributes не возвращаются из Get-User. Не у каждого пользователя есть почтовый ящик, поэтому иногда часть столбцов будет равна нулю. Но у меня есть чертовски время, выясняя лучший способ вернуть комбинированный стол, подобный этому.

Лучший ответ:

Получить пользователей, сохранить каждого пользователя в переменной, получить почтовый ящик для каждого пользователя, а затем создать новый объект со свойствами из обеих переменных

Get-User -Filter ... | Foreach-Object{

    $user = $_
    $mbx = Get-Mailbox $user

    New-Object -TypeName PSObject -Property @{
        FirstName = $user.FirstName
        LastName = $user.LastName
        Alias = $mbx.Alias
        CustomAttribute1 = $mbx.CustomAttribute1
    }
}

Ответ №1

Я создаю пользовательский объект, который может быть излишним, но это самый простой способ, который я нашел.

Вот пример кода для воспроизведения. Сообщите мне, вызвало ли оно какие-либо проблемы или дополнительные вопросы:

$outputCollection = @()
$users = Get-User -Filter "..."
$mailboxes = Get-Mailbox -Filter "..."

$users | Foreach-Object {
#Associate objects
$userObject = $_
$mailboxObject = $mailboxes | Where-Object {$_.Name -eq $userObject.Name}

#Make a combined object
$outputObject = "" | Select Name, UserAttribute, MailboxAttribute
$outputObject.Name = $userObject.Name
$outputObject.UserAttribute = $userObject.UserAttribute
$outputObject.MailboxAttribute = $mailboxObject.MailboxAttribute

#Add the object to the collection
$outputCollection += $outputObject
}

$outputCollection

Другим вариантом, который должен работать, называется вычисляемые свойства:

Get-User -Filter "..." | Select Name, UserAttribute, @{Name="OtherAttribute"; Expression={(Get-Mailbox $_.Name).MailboxAttribute}}

… обратите внимание, что это приведет к новой команде Get-Mailbox для каждой записи, что потенциально увеличивает время выполнения

Ответ №2

Спасибо, ребята. Я потратил много времени на то, чтобы выяснить мою собственную проблему, и ваш код помог мне понять все правильно. Мне нужно было найти все календари, если учетная запись по умолчанию не была установлена. Ниже приведено то, что мне нужно было использовать.

Get-Mailbox | ForEach-Object{
$user = $_
$calPerms = Get-MailboxFolderPermission $user":\calendar" -User Default | Where-Object {$_.AccessRights -eq "none"}

New-Object -TypeName PSObject -Property @{
Name = $user
Permissions = $calPerms.AccessRights
Users = $calPerms.user
}
}

Ответ №3

Один лайнер для получения FirstName, LastName, Alias ​​и CustomAttribute1:

Get-User | Select Firstname, Lastname, @{Name="Alias"; Expression={(Get-Mailbox $_.Name).Alias}}, @{Name="CustomAttribute1"; Expression={(Get-Mailbox $_.Name).CustomAttribute1}}

Оцените статью
TechArks.Ru
Добавить комментарий