This 'advanced' function will summarize performance logs generated by Windows Performance Logs and Alerts, or more recently, Data Collector Sets.  It uses the Powershell Import-Counter cmdlet.  Using the raw data retrieved, Measure-PerfLog will summarize the data by performance counter.

This function has been implemented as an advanced function, and accepts pipeline input.  The output is in the form of an object that can easily be exported using Export-Csv.

 

 

PowerShell
Edit|Remove
function Measure-PerfLog { 
  <# 
  .SYNOPSIS 
  Retrieves a summary of Performance logs 
  .DESCRIPTION 
  This function will analyse Performance Logs in the .blg, .csv or .txt format,  
  and produce a summary of the data by performance counter. 
  .EXAMPLE 
  Measure-PerfLog Baseline.blg 
  .EXAMPLE 
  Get-ChildItem *.csv | Measure-PerfLog 
  .EXAMPLE 
  Measure-PerfLog "test.blg" | Export-Csv -Path counters.csv 
  .EXAMPLE 
  Measure-PerfLog "test.blg" | ? {$_.maxval -gt 100} 
  .EXAMPLE 
   "test.blg" | Measure-PerfLog | ft -AutoSize 
  .PARAMETER Filenames[] 
  One or more file names, as returned by Get-ChildItem, or in a string array. 
  # Written by BigTeddy September 2, 2011 
  # Version 1.1 
  #> 
  [CmdletBinding()] 
  param 
  ( 
    [Parameter(Mandatory=$True, 
    ValueFromPipeline=$True, 
    ValueFromPipelineByPropertyName=$True, 
      HelpMessage='Please enter at least one .blg, .csv, or .txt file')] 
    [ValidateLength(5,30)] 
    [string]$Filename 
         
      ) 
   begin 
   {  
     $outinfo = @() 
   } # end begin 
   process { 
            Write-Host "Analysing $filename..." -ForegroundColor green 
            $logfile = Import-Counter $filename 
            $samples = New-Object System.Collections.ArrayList   
            foreach ($log in $logfile) {[void]$samples.Add($log.countersamples)} 
            for ($i = 0 ; $i -lt $samples[0].count; $i++) { 
                $value = 0 
                $maxvalue = 0 
                $minvalue = $samples[0][$i].cookedvalue 
                for ($j = 0 ; $j -lt $samples.count; $j++){ 
                    $v = $samples[$j][$i].cookedvalue 
                    $value +$v 
                    if ($v -gt $maxvalue) { $maxvalue = $v } 
                    if ($v -lt $minvalue) { $minvalue = $v } 
                    } #end $j for loop 
                $outdetail = New-Object System.Object 
                $outdetail | Add-Member -type NoteProperty -name Counter -value $samples[0][$i].path 
                $outdetail | Add-Member -type NoteProperty -name MaxVal -value $maxvalue 
                $outdetail | Add-Member -type NoteProperty -name MinVal -value $minvalue 
                $outdetail | Add-Member -type NoteProperty -name Average -value ($value / $samples.count) 
                $outinfo +$outdetail 
                } #end $i for loop 
  } # end process 
  end 
  { 
    return $outinfo 
  } # end end 
} #end function Measure-PerfLog