【问题标题】:How do I do reflection / dynamic typing in Powershell with Measure-Object?如何使用 Measure-Object 在 Powershell 中进行反射/动态输入?
【发布时间】:2012-01-12 19:28:48
【问题描述】:

我有以下命令计算一个属性的平均值

  $Databases = Get-MailboxDatabase -Status
    foreach($Database in $Databases) {
        $DBSize = $Database.DatabaseSize
        $MBCount = @(Get-MailboxStatistics -Database $Database.Name).Count

    # This line is giving me trouble
        $MBAvg = Get-MailboxStatistics -Database $Database.Name    |   %{$_.TotalItemSize.value.ToMb()} |  Measure-Object -Average          

        New-Object PSObject -Property @{
            Server = $Database.Server.Name
            DatabaseName = $Database.Name
            LastFullBackup = $Database.LastFullBackup
            MailboxCount = $MBCount
            "DatabaseSize (GB)" = $DBSize.ToGB()
            "AverageMailboxSize (MB)" = $MBAvg.Average
            "WhiteSpace (MB)" = $Database.AvailableNewMailboxSpace.ToMb()
            Items = 0
            LogicalSize = 0
        }
    }

我想让“Measure-Object”跟踪几个属性,总数和平均值。

$MeasureProps = "AssociatedItemCount", "DeletedItemCount", "ItemCount", "TotalDeletedItemSize", "TotalItemSize"

   $Databases = Get-MailboxDatabase -Status
    foreach($Database in $Databases) {
        $DBSize = $Database.DatabaseSize
        $MBCount = @(Get-MailboxStatistics -Database $Database.Name).Count

        $MBStats = Get-MailboxStatistics -Database $Database.Name     

        #Expanded version of problem line above
        foreach($mb in $MBStats)
        {
         foreach($prop in $MeasureProps)
         {
            #this is a random hack.  I have almost no idea what I'm doing.
           select  $mb.$prop | Measure-Object -Property $prop -Sum -Average
         }          
        }

        New-Object PSObject -Property @{
            Server = $Database.Server.Name
            DatabaseName = $Database.Name
            LastFullBackup = $Database.LastFullBackup
            MailboxCount = $MBCount
            "DatabaseSize (GB)" = $DBSize.ToGB()
            "AverageMailboxSize (MB)" = $MBAvg.Average
            "WhiteSpace (MB)" = $Database.AvailableNewMailboxSpace.ToMb()
            Items = 0
            LogicalSize = 0
        }
    }

我遇到的问题是弄清楚如何编辑%{$_.TotalItemSize.value,以便我可以访问每个对象的总数。

【问题讨论】:

    标签: powershell foreach exchange-server powershell-2.0 exchange-server-2010


    【解决方案1】:

    Measure-Object 适用于数值。问题是 TotalItemSize 和 TotalDeletedItemSize 值是字符串。要解决此限制,您可以先使用 Select-Object cmdlet 扩展 TotalItemSize 和 TotalDeletedItemSize 的值,然后将结果通过管道传送到 Measure-Object

    $TotalItemSize = @{n='TotalItemSize';e={$_.TotalItemSize.Value.ToMB()}}
    $TotalDeletedItemSize = @{n='TotalDeletedItemSize';e={$_.TotalDeletedItemSize.Value.ToMB()}} 
    
    Get-MailboxStatistics -Database 'Mailbox Database 0311695863' | `
        Select-Object -Property AssociatedItemCount,DeletedItemCount,ItemCount,$TotalItemSize,$TotalDeletedItemSize | `
            Measure-Object -Property AssociatedItemCount,DeletedItemCount,ItemCount,TotalItemSize,TotalDeletedItemSize -Sum -Average
    

    【讨论】:

      【解决方案2】:

      %ForEach-Object 的别名。如果我理解正确,您想在TotalItemSize 值的集合上使用Measure-Object。如果是这样,您应该使用select,它是Select-Object 的别名。大致如下:

      [...] | select -ExpandProperty TotalItemSize | Measure-Object [...]
      

      当然,如果我没有正确理解您的问题,请纠正我;)

      编辑:

      我不知道满足您第二个问题条件的干净/内置方式,我刚刚注意到(即通过多个属性)。我检查了ExpandProperty 并没有像允许您以这种方式选择多个属性那样神奇;)我建议稍微重写代码并枚举属性:

      $MeasureProps = "AssociatedItemCount", [...], "TotalItemSize"
      foreach($prop in $MeasureProps)
      {
          select $prop | Measure-Object -Property $prop -Sum -Average
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        相关资源
        最近更新 更多