VMware Cloud Community
Sivaramsharmar
Enthusiast
Enthusiast
Jump to solution

VM OS Count

Hi All,

I am trying to find VM with OS Details, as we can get Guest OS Details when VMWare tools are running on it.

So I am trying to find the OS from VM Side.

When I am executing below command

(Get-View -ViewType virtualmachine | select -ExpandProperty summary | select -ExpandProperty config | where{$_.guestfullname -like "*win*"} | measure-object).count

I am getting exact output when I am trying in

get-vm | select @{N='Windows';E={($_ | get-view | select -ExpandProperty summary | select -ExpandProperty config | where{$_.guestfullname -like "*win*"} | measure-object).count}}

I am not getting count instead of it is counting each one by one.

If I got details using above command then I can generate Chart that is my motto.

Please suggest.

Reply
0 Kudos
1 Solution

Accepted Solutions
MKguy
Virtuoso
Virtuoso
Jump to solution

This should work:

$OSList = (Get-VM).ExtensionData.Config.GuestFullName

"" | Select @{N='Windows'; E={ ($OSList | Where { $_ -like '*windows*' } | Measure).Count }},

@{N='Linux'; E={ ($OSList | Where { $_ -like '*linux*' } | Measure).Count }},

@{N='Other'; E={ ($OSList | Where { $_ -inotmatch '(linux|windows)' } | Measure).Count }} | Format-Table -Autosize

This gives me output like this:

Windows  Linux   Other   Total

-------       -----     -----      -----

     98         37         3        138

-- http://alpacapowered.wordpress.com

View solution in original post

Reply
0 Kudos
6 Replies
LucD
Leadership
Leadership
Jump to solution

Try like this

(Get-View -ViewType VirtualMachine -Property Name,'Summary.Config.GuestFullName' `

    -Filter @{'Summary.Config.GuestFullName'='Win'}).Count


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

Reply
0 Kudos
Sivaramsharmar
Enthusiast
Enthusiast
Jump to solution

Thanks Lucd,

If I am executing your command individually I am getting output as exact,

but my output is supposed to be

Windows        Linux              Others               Total

169                    45                    8                       222

For this I am trying to execute like below

Get-VM | Select @{N='Windows';E={($_ | get-view | select -expandproperty summary | select -expandproperty config | where{$_.guestfullname -like "*Win*"}| measure-object).count}}.........

Like this I am trying to execute but I am not getting expected results.

Please suggest.

Reply
0 Kudos
Zsoldier
Expert
Expert
Jump to solution

Riding on Luc's coat tails here is how I would write something that you are looking for like so:

$TotalVMs = Get-View -ViewType VirtualMachine -Property Name,'Summary.Config.GuestFullName'

$OSFilters = $TotalVMs | select -ExpandProperty summary | select -expandproperty config | select -unique guestfullname | sort

$MyCustomReport = New-Object PSObject

Foreach ($OSFilter in $OSFilters)

     {$MyCustomReport | Add-Member -Name $OSFilter.GuestFullName -MemberType NoteProperty -Value ($totalvms | select -expandproperty summary | select -expandproperty config | where {$_.GuestFullName -eq $OSFilter.guestfullname}).count}

$MyCustomReport | Add-member -Name Total -MemberType NoteProperty -Value $TotalVMs.Count

$MyCustomReport

This way you can continue to use this script even if 'other' OS types get added without having to mess w/ static filters.

Chris Nakagaki (中垣浩一)
Blog: https://tech.zsoldier.com
Twitter: @zsoldier
MKguy
Virtuoso
Virtuoso
Jump to solution

This should work:

$OSList = (Get-VM).ExtensionData.Config.GuestFullName

"" | Select @{N='Windows'; E={ ($OSList | Where { $_ -like '*windows*' } | Measure).Count }},

@{N='Linux'; E={ ($OSList | Where { $_ -like '*linux*' } | Measure).Count }},

@{N='Other'; E={ ($OSList | Where { $_ -inotmatch '(linux|windows)' } | Measure).Count }} | Format-Table -Autosize

This gives me output like this:

Windows  Linux   Other   Total

-------       -----     -----      -----

     98         37         3        138

-- http://alpacapowered.wordpress.com
Reply
0 Kudos
Sivaramsharmar
Enthusiast
Enthusiast
Jump to solution

Your Script will return OS Flavour as well. Thanks for your support Chris.

Reply
0 Kudos
Sivaramsharmar
Enthusiast
Enthusiast
Jump to solution

Thanks MK,

Your Script will return the desired output,

But it is not identifying CentOS, So I have did one small correction.

$OSList = (Get-VM).ExtensionData.Config.GuestFullName

$vmre = "" |select @{N='Windows'; E={ ($OSList | Where { $_ -like '*wind*' } | Measure).Count }},

@{N='Linux'; E={ ($OSList | Where { $_ -inotmatch '(other|wind)' } | Measure).Count }},

@{N='Other'; E={ ($OSList | Where { $_ -like '*other*' } | Measure).Count }} | Format-Table -Autosize

More Over I am trying to generate Pie Chart for this,I have referred this blog http://blogs.technet.com/b/richard_macdonald/archive/2009/04/28/3231887.aspx

but I am not able to do so, Could you please help me where I am doing wrong.

[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")

$scriptpath = "c:\users\$env:username\"

# chart object

   $chart1 = New-object System.Windows.Forms.DataVisualization.Charting.Chart

   $chart1.Width = 1200

   $chart1.Height = 500

   $chart1.BackColor = [System.Drawing.Color]::White

# title

   [void]$chart1.Titles.Add("Virtual Machine Operating System Report")

   $chart1.Titles[0].Font = "Arial,13pt"

   $chart1.Titles[0].Alignment = "topLeft"

# chart area

   $chartarea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea

   $chartarea.Name = "ChartArea1"

   $chartarea.AxisY.Title = "count"

   $chartarea.AxisX.Title = "OS Type"

   $chartarea.AxisY.Interval = 10

   $chartarea.AxisX.Interval = 1

  

  

   $chart1.ChartAreas.Add($chartarea)

# legend

   $legend = New-Object system.Windows.Forms.DataVisualization.Charting.Legend

   $legend.name = "Legend1"

   $chart1.Legends.Add($legend)

# data source

  

$datasource = $vmre | select Windows,Linux,Other

# data series

   [void]$chart1.Series.Add("VM Usage")

   $chart1.Series["VM Usage"].ChartType = "Column"

   $chart1.Series["VM Usage"].IsVisibleInLegend = $true

   $chart1.Series["VM Usage"].BorderWidth  = 3

   $chart1.Series["VM Usage"].chartarea = "ChartArea1"

   $chart1.Series["VM Usage"].Legend = "Legend1"

   $chart1.Series["VM Usage"].color = "#62B5CC"

   $chartArea.AxisX.LabelStyle.Enabled = $true

   $chartarea.AxisX.LabelStyle.Angle = "-45"

  $datasource | foreach-object{

$chart1.Series["VM Usage"].Points.addxy( $_.Windows,$_.linux,$_.other)

$Chart1.Series["VM Usage"]["DrawingStyle"] = "Cylinder"

#Remove # Below if you want report in Pie Chart

$Chart1.Series["VM Usage"].ChartType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Pie

$Chart1.Series["VM Usage"]["PieLabelStyle"] = "Outside"

$Chart1.Series["VM Usage"]["PieLineColor"] = "Black"

$Chart1.Series["VM Usage"]["PieDrawingStyle"] = "Concave"

#($Chart1.Series["VM Usage"].Points.FindMaxByValue())["Exploded"] = $true

#($Chart1.Series["VM Usage"].Points.FindMinByValue() | select -First 1)["Exploded"] = $true

}

$maxValuePoint = $Chart1.Series["VM Usage"].Points.FindMaxByValue() 

$maxValuePoint.Color = [System.Drawing.Color]::Red

$minValuePoint = $Chart1.Series["VM Usage"].Points.FindMinByValue()  

$minValuePoint.Color = [System.Drawing.Color]::Green

$chart1.SaveImage("$scriptpath\vCenter_VirtualMachine_report.png","png")

Reply
0 Kudos