结合Powershell cmdlet问题

时间:2015-04-20 15:00:23

标签: powershell cmdlets

我拼凑了一个脚本(抱歉无法记住源代码),它使用两个cmdlet(Get-user& Get-mailboxstatistics)返回多个属性。如果我指定一个单独的用户,但是当使用通配符返回所有用户时,代码将按预期工作,它只返回Get-user中的属性,并且我不知道原因。

任何帮助解决此问题表示赞赏。

    $outputCollection = @()
$users = Get-User -identity *
$mailboxes = Get-Mailboxstatistics -identity *

$users | Foreach-Object {
   #Associate objects
$userObject = $_
$mailboxObject = $mailboxes
$emailObject = $mail

#Make a combined object
$outputObject = "" | Select FirstName,Lastname,sAMAccountName,windowsemailaddress,ItemCount,Totalitemsize,TotalDeletedItemSize,DatabaseName,ServerName,LastLogonTime,LastLogoffTime
$outputObject.FirstName = $userObject.FirstName
$outputObject.Lastname = $userObject.Lastname
$outputObject.sAMAccountName = $userObject.sAMAccountName
$outputObject.windowsemailaddress = $userObject.windowsemailaddress   
$outputObject.itemcount = $mailboxObject.itemcount
$outputObject.Totalitemsize = $MailboxObject.Totalitemsize
$outputObject.TotalDeletedItemSize = $MailboxObject.TotalDeletedItemSize
$outputObject.DatabaseNAme = $mailboxObject.DatabaseName  
$outputObject.ServerName = $mailboxObject.ServerName  
$outputObject.lastlogontime = $mailboxObject.lastlogontime
$outputObject.lastlogofftime = $mailboxObject.lastlogofftime


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

 $outputCollection

4 个答案:

答案 0 :(得分:0)

为了帮助您了解我尽可能少地改变了。对于初学者,我会删除$mailboxes = Get-Mailboxstatistics -identity *行。然后,为简单起见,请更新下面的行

$mailboxObject = Get-Mailboxstatistics -identity $userObject.UserPrincipalName

您需要在每次循环传递中获取 one 邮箱的统计信息。更改填充$mailboxObject的方式应该可以实现,而无需更改任何其他内容。

您可以删除$emailObject = $mail,因为您似乎无法在任何地方使用它。

FYI这未经测试但应该有效。这也假定用户实际上有一个交换邮箱。如果不是,则输出中将显示空值。

关于效率

我想尝试让你更容易理解。但请注意,Bacon Bits试图告诉您每次不运行Get-Mailboxstatistics的内容是正确的。我的解决方案应该仍然有效。

答案 1 :(得分:0)

基本问题是$users$mailboxes之间没有相关性。

例如:为什么$mailboxObject = $mailboxes会自动选择正确的用户邮箱?答案是它不会。它将返回 $mailboxes 中的所有内容。因此$mailboxObject.FirstName并不意味着什么,因为$mailboxObject是一个数组,就像$mailboxes一样。你可以说``$ mailboxObject [0] .FirstName`,但这不会正确关联。

您需要一个存在于两个对象中的关键字段,您可以使用$mailboxObject = $mailboxes | Where-Object { $_.SomeKeyField = $userObject.SomeKeyField }语句进行查找。

或者,您可以等到运行Get-MailboxStatistics,直到您进入循环,但这会显着增加Exchange系统的流量。

另外,请记住,以上所有内容都假定每个MailboxStatistic都存在一个用户。如果情况并非如此,如果您想要在结果中同时使用这两种方法,那么您将不得不做更多的工作。

答案 2 :(得分:0)

你可以试试这个!

如培根所述,$ users或$ mailboxes应该用两者之间的关系进行过滤;就像外键一样。

**在添加键值对时总是使用哈希表,以便有更多操作和易于理解的选项

        # DECLARE HASHTABLE
        $outputCollection = @{}

        $users = Get-User -identity *
        $mailboxes = Get-Mailboxstatistics -identity $userObject.UserPrincipalName

        $users | Foreach-Object {
        #Associate objects
        $userCollection = $_
        $mailboxCollection = $mailboxes | Where-Object { $_.SomeKeyField = $userCollection.SomeKeyField }

        # ADD ELEMENTS TO HASH TABLE

        # Add elements from userCollection
        $outputCollection.add("FirstName",$userCollection.FirstName);
        $outputCollection.add("Lastname",$userCollection.Lastname);
        $outputCollection.add("sAMAccountName",$userCollection.sAMAccountName);
        $outputCollection.add("windowsemailaddress",$userCollection.windowsemailaddress);

        # Add elements from mailboxCollection
        $outputCollection.add("itemcount",$mailboxCollection.itemcount);
        $outputCollection.add("Totalitemsize",$mailboxCollection.Totalitemsize);
        $outputCollection.add("TotalDeletedItemSize",$mailboxCollection.TotalDeletedItemSize);
        $outputCollection.add("DatabaseNAme",$mailboxCollection.DatabaseNAme);
        $outputCollection.add("ServerName",$mailboxCollection.ServerName);
        $outputCollection.add("lastlogontime",$mailboxCollection.lastlogontime);
        $outputCollection.add("lastlogofftime",$mailboxCollection.lastlogofftime);
        }

        $outputCollection

通过使用哈希表,您也可以使用不同的名称作为键,例如,您可以执行此操作,

       outputCollection.add("Last Logoff Time",$mailboxCollection.lastlogofftime);
       #Instead of
       outputCollection.add("lastlogofftime",$mailboxCollection.lastlogofftime);

希望这会有所帮助!!

答案 3 :(得分:0)

感谢所有帮助。我终于使用以下代码对此进行了排序。

Get-MailboxServer | Get-Mailbox -resultsize 1 | foreach-object {$email = $_.primarysmtpaddress; $_ | Get-MailboxStatistics | Sort @{expression= "totalitemsize";descending=$true}}| select DisplayName, @{expression={$_.totalitemsize.value.ToMB()};label=”Size(MB)”}, @{expression={$_.TotalDeletedItemSize.value.ToMB()};label=”Deleted Size(MB)”}, ServerName, DatabaseName, itemcount, lastlogontime, lastloggedonuseraccount, @{Name="EmailAddress";expression={$email}}| Export-csv c:\Report.csv -notypeinformation