Как сделать отражение / динамическую типизацию в Powershell с помощью Measure-Object? - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть следующая команда, которая вычисляет среднее значение одного свойства

  $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, чтобы я мог получить доступ к итоговому значению для каждого объекта.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

Measure-Object работает с числовыми значениями. Проблема в том, что значения TotalItemSize и TotalDeletedItemSize являются строками. Чтобы обойти это ограничение, вы можете использовать командлет Select-Object, чтобы сначала развернуть значения 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
1 голос
/ 05 декабря 2011

% - псевдоним для ForEach-Object. Если я правильно понимаю, вы хотите использовать Measure-Object для набора значений TotalItemSize. Если это так, вы должны использовать select, который является псевдонимом для Select-Object. Что-то вроде этого:

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

И, конечно, поправьте меня, если я не правильно понял вашу проблему;)

EDIT:

Мне не известен способ очистки / встраивания, который бы удовлетворял условиям вашего второго вопроса, который я только что заметил (т. Е. Передал более одного свойства). Я проверил, и ExpandProperty не так волшебен, чтобы позволить вам выбирать несколько свойств таким образом;) Я бы посоветовал немного переписать код и перечислить свойства в любом случае:

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