none
Measure-Object on multiple Measure-Objects RRS feed

  • Frage

  • Hi,

    I have a problem and I hope you can help me.

    What I want to do: I want to get the monthly peak of ESXi CPU usage.

    What I already did: I wrote a script to check every day ESXi CPU usage with VMware PowerCLI and run "Measure-Object -Maximum" to geht the daily peak. Then I export this "Measure-Object"-Object with "Export-Clixml".

    # Global
    $cluster = "name"
    $start = (Get-Date -hour 0 -minute 0 -second 0).AddDays(-1)
    $finish = (Get-Date -hour 23 -minute 59 -second 59).AddDays(-1)
    $FileName = get-date -uformat "%Y-%m-%d"
    #
    # Cpu peak of last day
    $test = Get-Stat -Entity (get-vmhost -location (get-cluster -name $cluster)) -Stat Cpu.Usage.Average -Start $start -Finish $finish -IntervalMins 5 | Measure-Object -Property "Value" -Maximum
    #
    # Export
    Export-Clixml -Path $env:TEMP\xml\$FileName.xml -inputobject $test

    My Problem: Now I need a monthly script that import all objects and figure out the monthly peak. My first idea was to read all files into an array. Didn't work. My second idea was to create a new PSObject and fill this with the data. Didn't work either. I understand why the first solution didn't work. But I don't get the problem on the second solution.

    $month = @()
    foreach ($file in (Get-ChildItem $env:TEMP\xml\)) {$month += Import-Clixml -Path $env:TEMP\xml\$file}
    write-output $month
    Measure-Object -InputObject $month -Property Maximum -Maximum
    
    # ---------- Output ----------
    # write-output $month
    <#
    Count    : 803
    Average  :
    Sum      :
    Maximum  : 14,9300003051758
    Minimum  :
    Property : Value
    
    Count    : 803
    Average  :
    Sum      :
    Maximum  : 15,9300003051758
    Minimum  :
    Property : Value
    
    Count    : 803
    Average  :
    Sum      :
    Maximum  : 13,9300003051758
    Minimum  :
    Property : Value
    
    Count    : 803
    Average  :
    Sum      :
    Maximum  : 5,93000030523578
    Minimum  :
    Property : Value
    >#
    # Measure-Object -InputObject $month -Property Maximum -Maximum
    <#
    Measure-Object : Die Maximum-Eigenschaft kann in keiner Eingabe eines Objekts gefunden werden.
    Bei Zeile:1 Zeichen:15
    + Measure-Object <<<<  -InputObject $month -Property Maximum -Maximum
        + CategoryInfo          : InvalidArgument: (:) [Measure-Object], PSArgumentException
        + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand
    #>

    function New-Dataset {
    	New-Object PSObject -Property @{
    		Date = ''
    		Test = 0
    	}
    }
    
    $month = @()
    foreach ($file in (Get-ChildItem $env:TEMP\xml\))
    {
    	$temp = Import-Clixml -Path $env:TEMP\xml\$file
    	$dataset = New-Dataset
    	$dataset.Date = $file.Name.Substring(0,10)
    	$dataset.Test= $temp.Maximum
    	$month += $dataset
    }
    
    write-output $month
    Measure-Object -InputObject $month -Property Test -Maximum
    
    # ---------- Output ---------- 
    # write-output $month
    <#
                Test Date
                ---- ----
    14,9300003051758 2012-03-04
    15,9300003051758 2012-03-05
    13,9300003051758 2012-03-06
    5,93000030523578 2012-03-07
    #>
    #Measure-Object -InputObject $month -Property Test -Maximum
    <#
    Measure-Object : Die Test-Eigenschaft kann in keiner Eingabe eines Objekts gefunden werden.
    Bei Zeile:1 Zeichen:15
    + Measure-Object <<<<  -InputObject $month -Property Test -Maximum
        + CategoryInfo          : InvalidArgument: (:) [Measure-Object], PSArgumentException
        + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand
    #>

    I'm sorry about the German error messages, it's a German installation. The message "Die Test-Eigenschaft kann in keiner Eingabe eines Objekts gefunden werden." does mean "Could not find any Test-Property in the object."

    Thanks for your help!

    Cailore


    • Bearbeitet Cailore Donnerstag, 8. März 2012 13:12
    Donnerstag, 8. März 2012 13:08

Antworten

  • Der Schalter "-inputobject" verarbeitet nicht die einzelnen Objekte in deinem Array, statt dessen wird $month als einzelnes Objekt behandelt. Das hat aber die "test"-Eigenschaft nicht, daher der Fehler.

    Wenn du die Objekte in $month über die Pipeline einzeln an measure-object fütterst, gehts:

    $month | Measure-Object  -property test -Maximum -Minimum -Sum | Out-Host


    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".




    Donnerstag, 8. März 2012 14:20
    Moderator

Alle Antworten

  • Der Schalter "-inputobject" verarbeitet nicht die einzelnen Objekte in deinem Array, statt dessen wird $month als einzelnes Objekt behandelt. Das hat aber die "test"-Eigenschaft nicht, daher der Fehler.

    Wenn du die Objekte in $month über die Pipeline einzeln an measure-object fütterst, gehts:

    $month | Measure-Object  -property test -Maximum -Minimum -Sum | Out-Host


    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".




    Donnerstag, 8. März 2012 14:20
    Moderator
  • Hallo Denniver,

    ja das ist es! Der Unterschied war mir nicht bewusst.

    Vielen Dank für die prompte Lösung!

    Donnerstag, 8. März 2012 14:59