【问题标题】:Combining Powershell cmdlets issue结合 Powershell cmdlet 问题
【发布时间】:2015-04-20 15:00:23
【问题描述】:

我拼凑了一个脚本(抱歉不记得来源),它使用两个 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

【问题讨论】:

    标签: powershell powershell-cmdlet


    【解决方案1】:

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

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

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

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

    仅供参考,这未经测试,但应该可以工作。这也假设用户实际上有一个交换邮箱。如果不是,输出中将有空值。

    关于效率

    我想尝试使这更简单,以便您理解。但是请注意,Bacon Bits 试图告诉您不要每次都运行Get-Mailboxstatistics 是真的。我的解决方案应该仍然有效。

    【讨论】:

    • 您好,感谢您的帮助,我已按照您的说法编辑了代码,但出现以下错误。 Get-MailboxStatistics:无法绑定参数“身份”。无法将值“”转换为类型“Microsoft.Exchange.Configuration.Tasks.GeneralMailboxOrMailUserIdParameter”。错误:“Microsoft.Exchange.Configuration.Task s.GeneralMailboxOrMailUserIdParameter 类型的参数值不能为空。请指定一个值,然后重试。
    • 上面的$userObject = $_ 行还有吗?听起来$userObject.UserPrincipalName 正在返回空值。如果您只有 $userObject.UserPrincipalName 行,它会返回所需的输出吗?
    【解决方案2】:

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

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

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

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

    另外,请记住,以上所有内容都假设每个 MailboxStatistic 都存在一个用户。如果不是这种情况,如果您希望两者都出现在结果中,您将不得不做更多的工作。

    【讨论】:

      【解决方案3】:

      你可以试试这个!

      正如 Bacon 所说,$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);
      

      希望这会有所帮助!

      【讨论】:

      • 感谢您的帮助。我尝试使用您的代码,但收到错误方法调用失败,因为 [System.Collections.Hashtable] 不包含名为“add_item”的方法。也只是想检查 $outputCollection.add_item("FirstName",userCollection.FirstName);'应该是 $outputCollection.add_item("FirstName",$userCollection.FirstName);
      • 感谢您告诉我!
      【解决方案4】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 2014-10-13
        • 2016-01-10
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多