在PowerShell中,如何组合两个具有1对1关系的命令的结果?

时间:2012-07-30 12:43:05

标签: powershell

此特定示例是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

请注意,Get-Mailbox不会返回FirstName和LastName,相反,Get-User不会返回Alias和CustomAttributes。并非每个用户都有邮箱,因此有时列的一部分将为空。但是我有一段时间想出最好的方法来返回这样的组合表。

4 个答案:

答案 0 :(得分:14)

获取用户,将每个用户保存在变量中,获取每个用户的邮箱,然后使用两个变量的属性创建一个新对象

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 :(得分:5)

我制作了一个自定义对象,这可能有些过分,但这是我找到的最简单的方法。

以下是一些示例代码。如果它产生任何麻烦或其他问题,请告诉我:

$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 :(得分:0)

谢谢你们。我花了很多时间试图弄清楚自己的问题,而你的代码帮助我把它弄好了。我需要找到所有日历,默认帐户设置为无。以下是我需要使用的内容。

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 :(得分:0)

获取FirstName,LastName,Alias和CustomAttribute1的一行:

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