Powershell管道 - 从第一个cmdlet检索输出?

时间:2012-05-11 15:06:19

标签: powershell

我在Powershell中尝试了一些事情,而我无法实现的目标如下(在Exchange中):

Get-User | Get-MailboxStatistics

但是在输出中我想要"Get-User" cmdlet中的一些字段/输出以及"Get-MailboxStatistics" cmdlet中的一些字段/输出。

如果有人有答案,我已经在网上搜索过但没有成功,因为我很难用几句话解释它。

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

从执行一个cmdlet开始,将结果传递给Foreach-Object,然后保存对当前对象($ user)的引用,现在执行第二个命令并将其保存在变量中。使用两个对象的属性创建新对象。

您还需要过滤具有邮箱的用户,使用RecipientTypeDetails参数。

$users = Get-User -RecipientTypeDetails UserMailox 
$users | Foreach-Object{

    $user = $_
    $stats = Get-MailboxStatistics $user

    New-Object -TypeName PSObject -Property @{
        FirstName = $user.FirstName
        LastName = $user.LastName
        MailboxSize = $stats.TotalItemSize
        ItemCount =  $stats.ItemCount   
    }
}

答案 1 :(得分:2)

我不知道它是最佳还是最佳解决方案,但你肯定是通过将​​实际用户保存到foreach中的变量来实现的:

$users = Get-User 
$users | % { $user = $_; Get-MailboxStatistics $_ | % 
    { 
        "User name:{0} - some mailbox statistics: {1}" -f $user.SomePropertyOfUser, $_.SomePropertyOfMailbox
    } 
}

只有在使用Exchange cmdlet时才需要第一步(将用户保存到单独的变量中) - 如上所述here,您无法在foreach中嵌套Exchange cmdlet ...

  

通过PowerShell远程处理执行Exchange cmdlet时会导致此错误,该cmdlet不支持同时运行多个管道。将输出从cmdlet管道传输到foreach-object时会出现此错误,该对象随后会在其scriptblock中运行另一个cmdlet。

答案 2 :(得分:0)

$users = Get-User  -RecipientTypeDetails UserMailbox
$users | Foreach-Object{ $user = $_; $stats = Get-MailboxStatistics $user.DistinguishedName; New-Object -TypeName PSObject -Property @{FirstName = $user.FirstName; LastName = $user.LastName;MailboxSize = $stats.TotalItemSize;ItemCount =  $stats.ItemCount  }}

我必须在Get-MailboxStatistics的输入中添加一个特定字段,因为远程,我有:

The following Error happen when opening the remote Runspace: System.Management.Automation.RemoteException: Cannot process argument transformation on parameter 'Identity'. Cannot convert the "gsx-ms.com/Users/userName1" value of type "Deserialized.Microsoft.Exchange.Data.Directory.Management.User" to type "Microsoft.Exchange.Configuration.Tasks.GeneralMailboxOrMailUserIdParameter".

无论如何,谢谢@Jumbo和@ Shay-levy

答案 3 :(得分:0)

Get-ADUser -identity ADACCOUNT | Select-object @{Name="Identity";Expression={$_.SamAccountName}} | Get-MailboxStatistics

由于某种原因,Identity参数不按值输入pipelne,仅按属性名称输入。因此,为了使其工作,您可以更改数据中管道的名称以匹配Identity的参数名称。然后,Get-MailboxStatistics终于知道如何处理通过管道提供数据的数据。