VMware Cloud Community
taskino
Enthusiast
Enthusiast
Jump to solution

Export VM Properties in a CSV file

Hello Everyone,

I found a powercli script in the community forum and modified a little bit. What i want to do is, I want get VM properties per CLUSTER and export the selected properties to CSV file then email it. When I run the script I see three different properties on the scrren ( Write-Host $Report ) but when i look at the csv file I am only seeing one VM entry rather then three. Here is what i have so far;

  1. VMware VirtualCenter server name #

####################################

$vcserver="localhost"

##################

  1. Add VI-toolkit #

##################

Add-PSsnapin VMware.VimAutomation.Core

Initialize-VIToolkitEnvironment.ps1

connect-VIServer $vcserver

##################

  1. Mail variables #

##################

$enablemail="No"

$smtpServer = "mymailserver.com"

$mailfrom = "Test VMware Status <NO-REPLY_@mydomain.com>"

$mailto = "Testvm@mydomain.com"

#############

  1. Variables #

#############

$filelocation="D:\temp\healthcheck.csv"

$date=get-date

#############################

  1. Get-VM Information #

#############################

Get-VM | `

ForEach-Object {

$VM = $_

$VMview = $VM | Get-View

$VMResourceConfiguration = $VM | Get-VMResourceConfiguration

$VMHardDisks = $VM | Get-HardDisk

$HardDisksSizesGB = @()

$Temp = $VMHardDisks | ForEach-Object { $HardDisksSizesGB += ::Round($_.CapacityKB/1MB) }

$VmdkSizeGB = ""

$Temp = $HardDisksSizesGB | ForEach-Object { $VmdkSizeGB = "$_" }

$VmdkSizeGB = $VmdkSizeGB.TrimEnd("+")

$TotalHardDisksSizeGB = 0

$Temp = $HardDisksSizesGB | ForEach-Object { $TotalHardDisksSizeGB += $_ }

$Snapshots = $VM | Get-Snapshot

$Report = "" | Select-Object VMname,ESXname,ClusterName,MemoryGB,vCPUcount,vNICcount,IPaddresses,VmdkSizeGB,TotalVmdkSizeGB,DatastoreName,ToolsVersion,ToolsUpdate,NumCpuShares,CpuLimitMHZ,CpuReservationMHZ,NumMemShares,ReservationsMB,LimitMB,SnapshotCount,GuestOS

$Report.VMName = $VM.name

$Report.ESXname = $VM.Host

$Report.ClusterName = ($VM | Get-Cluster).Name

$Report.MemoryGB = $VM.MemoryMB/1024

$Report.vCPUcount = $VM.NumCpu

$Report.vNICcount = $VM.Guest.Nics.Count

$Report.IPaddresses = $VM.Guest.IPAddress

$Report.VmdkSizeGB = $VmdkSizeGB

$Report.TotalVmdkSizeGB = $TotalHardDisksSizeGB

$Report.DatastoreName = $VMview.Config.DatastoreUrl

$Report.ToolsVersion = $VMview.Config.Tools.ToolsVersion

$Report.ToolsUpdate = $VMview.Guest.ToolsStatus

$Report.NumCpuShares = $VMResourceConfiguration.NumCPUShares

$Report.CpuLimitMHZ = $VMResourceConfiguration.CpuLimitMhz

$Report.CpuReservationMHZ = $VMResourceConfiguration.CpuReservationMhz

$Report.NumMemShares = $VMResourceConfiguration.NumMemShares

$Report.ReservationsMB = $VMResourceConfiguration.MemReservationMB

$Report.LimitMB = $VMResourceConfiguration.MemLimitMB

$Report.SnapshotCount = (@($VM | Get-Snapshot)).Count

$Report.GuestOS = $VM.Guest.OSFullName

Write-Host $Report

$Report | where-object {$_.ClusterName -eq "Test_Cluster"} | Select-Object -Property ClusterName,ESXName,Vmname,Memorygb,VCPUCount | sort -Property ESXName | Export-csv "$filelocation" -NoTypeInformation

}

if ($enablemail -match "yes")

{

$msg = new-object Net.Mail.MailMessage

$att = new-object Net.Mail.Attachment($filelocation)

$smtp = new-object Net.Mail.SmtpClient($smtpServer)

$msg.From = $mailfrom

$msg.To.Add($mailto)

$msg.Subject = “Test VMware Status”

$msg.Body = “Test VMware Status”

$msg.Attachments.Add($att)

$smtp.Send($msg)

}

Any help greatly appreciated.

Tags (5)
0 Kudos
1 Solution

Accepted Solutions
Zsoldier
Expert
Expert
Jump to solution

Change this section:

Get-VM | `
ForEach-Object {
$VM = $_
$VMview = $VM | Get-View
$VMResourceConfiguration = $VM | Get-VMResourceConfiguration
$VMHardDisks = $VM | Get-HardDisk
$HardDisksSizesGB = @()
$Temp = $VMHardDisks | ForEach-Object { $HardDisksSizesGB += Math::Round($_.CapacityKB/1MB) }
$VmdkSizeGB = ""
$Temp = $HardDisksSizesGB | ForEach-Object { $VmdkSizeGB = "$_" }
$VmdkSizeGB = $VmdkSizeGB.TrimEnd("+")
$TotalHardDisksSizeGB = 0
$Temp = $HardDisksSizesGB | ForEach-Object { $TotalHardDisksSizeGB += $_ }
$Snapshots = $VM | Get-Snapshot
$Report = "" | Select-Object VMname,ESXname,ClusterName,MemoryGB,vCPUcount,vNICcount,IPaddresses,VmdkSizeGB,TotalVmdkSizeGB,DatastoreName,ToolsVersion,ToolsUpdate,NumCpuShares,CpuLimitMHZ,CpuReservationMHZ,NumMemShares,ReservationsMB,LimitMB,SnapshotCount,GuestOS
$Report.VMName = $VM.name
$Report.ESXname = $VM.Host
$Report.ClusterName = ($VM | Get-Cluster).Name
$Report.MemoryGB = $VM.MemoryMB/1024
$Report.vCPUcount = $VM.NumCpu
$Report.vNICcount = $VM.Guest.Nics.Count
$Report.IPaddresses = $VM.Guest.IPAddress
$Report.VmdkSizeGB = $VmdkSizeGB
$Report.TotalVmdkSizeGB = $TotalHardDisksSizeGB
$Report.DatastoreName = $VMview.Config.DatastoreUrl
$Report.ToolsVersion = $VMview.Config.Tools.ToolsVersion
$Report.ToolsUpdate = $VMview.Guest.ToolsStatus
$Report.NumCpuShares = $VMResourceConfiguration.NumCPUShares
$Report.CpuLimitMHZ = $VMResourceConfiguration.CpuLimitMhz
$Report.CpuReservationMHZ = $VMResourceConfiguration.CpuReservationMhz
$Report.NumMemShares = $VMResourceConfiguration.NumMemShares
$Report.ReservationsMB = $VMResourceConfiguration.MemReservationMB
$Report.LimitMB = $VMResourceConfiguration.MemLimitMB
$Report.SnapshotCount = (@($VM | Get-Snapshot)).Count
$Report.GuestOS = $VM.Guest.OSFullName
Write-Host $Report 
$Report | where-object {$_.ClusterName -eq "Test_Cluster"} | Select-Object -Property ClusterName,ESXName,Vmname,Memorygb,VCPUCount | sort -Property ESXName | Export-csv "$filelocation" -NoTypeInformation
} 

To this:

$NewObject = @()
Get-VM | `
ForEach-Object {
$VM = $_
$VMview = $VM | Get-View
$VMResourceConfiguration = $VM | Get-VMResourceConfiguration
$VMHardDisks = $VM | Get-HardDisk
$HardDisksSizesGB = @()
$Temp = $VMHardDisks | ForEach-Object { $HardDisksSizesGB += Math::Round($_.CapacityKB/1MB) }
$VmdkSizeGB = ""
$Temp = $HardDisksSizesGB | ForEach-Object { $VmdkSizeGB = "$_" }
$VmdkSizeGB = $VmdkSizeGB.TrimEnd("+")
$TotalHardDisksSizeGB = 0
$Temp = $HardDisksSizesGB | ForEach-Object { $TotalHardDisksSizeGB += $_ }
$Snapshots = $VM | Get-Snapshot
$Report = "" | Select-Object VMname,ESXname,ClusterName,MemoryGB,vCPUcount,vNICcount,IPaddresses,VmdkSizeGB,TotalVmdkSizeGB,DatastoreName,ToolsVersion,ToolsUpdate,NumCpuShares,CpuLimitMHZ,CpuReservationMHZ,NumMemShares,ReservationsMB,LimitMB,SnapshotCount,GuestOS
$Report.VMName = $VM.name
$Report.ESXname = $VM.Host
$Report.ClusterName = ($VM | Get-Cluster).Name
$Report.MemoryGB = $VM.MemoryMB/1024
$Report.vCPUcount = $VM.NumCpu
$Report.vNICcount = $VM.Guest.Nics.Count
$Report.IPaddresses = $VM.Guest.IPAddress
$Report.VmdkSizeGB = $VmdkSizeGB
$Report.TotalVmdkSizeGB = $TotalHardDisksSizeGB
$Report.DatastoreName = $VMview.Config.DatastoreUrl
$Report.ToolsVersion = $VMview.Config.Tools.ToolsVersion
$Report.ToolsUpdate = $VMview.Guest.ToolsStatus
$Report.NumCpuShares = $VMResourceConfiguration.NumCPUShares
$Report.CpuLimitMHZ = $VMResourceConfiguration.CpuLimitMhz
$Report.CpuReservationMHZ = $VMResourceConfiguration.CpuReservationMhz
$Report.NumMemShares = $VMResourceConfiguration.NumMemShares
$Report.ReservationsMB = $VMResourceConfiguration.MemReservationMB
$Report.LimitMB = $VMResourceConfiguration.MemLimitMB
$Report.SnapshotCount = (@($VM | Get-Snapshot)).Count
$Report.GuestOS = $VM.Guest.OSFullName
$NewObject += $Report
}
$NewObject | where-object {$_.ClusterName -eq "Test_Cluster"} | Select-Object -Property ClusterName,ESXName,Vmname,Memorygb,VCPUCount | sort -Property ESXName | Export-csv "$filelocation" -NoTypeInformation

Chris Nakagaki (Zsoldier)

http://tech.zsoldier.com

Message was edited by: Zsoldier

Chris Nakagaki (中垣浩一)
Blog: https://tech.zsoldier.com
Twitter: @zsoldier

View solution in original post

0 Kudos
3 Replies
Dave_Mishchenko
Immortal
Immortal
Jump to solution

The problem is that each time you go through the loop, export-csv overwrites the current contents of your output file. export-csv doesn't natively support -append as does output-file (but if you do some searching you can find a function that you could add that would do that).

You could do the following:

1) Under your variables add - $response_file = @()

2) Change the last bit of the loop to this

   $Report.GuestOS = $VM.Guest.OSFullName

$Response_file += $Report | where-object {$_.ClusterName -eq "Test_Cluster"} | Select-Object -Property ClusterName,ESXName,Vmname,Memorygb,VCPUCount 
         }

$Response_file | sort -Property  ESXName |   Export-csv "$filelocation" -NoTypeInformation

Each time the loop runs it adds a line to $Response_file. There is then just a single export that occurs outside of the loop.




Dave

VMware Communities User Moderator

Now available - vSphere Quick Start Guide

Do you have a system or PCI card working with VMDirectPath? Submit your specs to the Unofficial VMDirectPath HCL.

taskino
Enthusiast
Enthusiast
Jump to solution

Dave,

Thank you, but adding the look that you post did not help. It did not return any data in csv file.

0 Kudos
Zsoldier
Expert
Expert
Jump to solution

Change this section:

Get-VM | `
ForEach-Object {
$VM = $_
$VMview = $VM | Get-View
$VMResourceConfiguration = $VM | Get-VMResourceConfiguration
$VMHardDisks = $VM | Get-HardDisk
$HardDisksSizesGB = @()
$Temp = $VMHardDisks | ForEach-Object { $HardDisksSizesGB += Math::Round($_.CapacityKB/1MB) }
$VmdkSizeGB = ""
$Temp = $HardDisksSizesGB | ForEach-Object { $VmdkSizeGB = "$_" }
$VmdkSizeGB = $VmdkSizeGB.TrimEnd("+")
$TotalHardDisksSizeGB = 0
$Temp = $HardDisksSizesGB | ForEach-Object { $TotalHardDisksSizeGB += $_ }
$Snapshots = $VM | Get-Snapshot
$Report = "" | Select-Object VMname,ESXname,ClusterName,MemoryGB,vCPUcount,vNICcount,IPaddresses,VmdkSizeGB,TotalVmdkSizeGB,DatastoreName,ToolsVersion,ToolsUpdate,NumCpuShares,CpuLimitMHZ,CpuReservationMHZ,NumMemShares,ReservationsMB,LimitMB,SnapshotCount,GuestOS
$Report.VMName = $VM.name
$Report.ESXname = $VM.Host
$Report.ClusterName = ($VM | Get-Cluster).Name
$Report.MemoryGB = $VM.MemoryMB/1024
$Report.vCPUcount = $VM.NumCpu
$Report.vNICcount = $VM.Guest.Nics.Count
$Report.IPaddresses = $VM.Guest.IPAddress
$Report.VmdkSizeGB = $VmdkSizeGB
$Report.TotalVmdkSizeGB = $TotalHardDisksSizeGB
$Report.DatastoreName = $VMview.Config.DatastoreUrl
$Report.ToolsVersion = $VMview.Config.Tools.ToolsVersion
$Report.ToolsUpdate = $VMview.Guest.ToolsStatus
$Report.NumCpuShares = $VMResourceConfiguration.NumCPUShares
$Report.CpuLimitMHZ = $VMResourceConfiguration.CpuLimitMhz
$Report.CpuReservationMHZ = $VMResourceConfiguration.CpuReservationMhz
$Report.NumMemShares = $VMResourceConfiguration.NumMemShares
$Report.ReservationsMB = $VMResourceConfiguration.MemReservationMB
$Report.LimitMB = $VMResourceConfiguration.MemLimitMB
$Report.SnapshotCount = (@($VM | Get-Snapshot)).Count
$Report.GuestOS = $VM.Guest.OSFullName
Write-Host $Report 
$Report | where-object {$_.ClusterName -eq "Test_Cluster"} | Select-Object -Property ClusterName,ESXName,Vmname,Memorygb,VCPUCount | sort -Property ESXName | Export-csv "$filelocation" -NoTypeInformation
} 

To this:

$NewObject = @()
Get-VM | `
ForEach-Object {
$VM = $_
$VMview = $VM | Get-View
$VMResourceConfiguration = $VM | Get-VMResourceConfiguration
$VMHardDisks = $VM | Get-HardDisk
$HardDisksSizesGB = @()
$Temp = $VMHardDisks | ForEach-Object { $HardDisksSizesGB += Math::Round($_.CapacityKB/1MB) }
$VmdkSizeGB = ""
$Temp = $HardDisksSizesGB | ForEach-Object { $VmdkSizeGB = "$_" }
$VmdkSizeGB = $VmdkSizeGB.TrimEnd("+")
$TotalHardDisksSizeGB = 0
$Temp = $HardDisksSizesGB | ForEach-Object { $TotalHardDisksSizeGB += $_ }
$Snapshots = $VM | Get-Snapshot
$Report = "" | Select-Object VMname,ESXname,ClusterName,MemoryGB,vCPUcount,vNICcount,IPaddresses,VmdkSizeGB,TotalVmdkSizeGB,DatastoreName,ToolsVersion,ToolsUpdate,NumCpuShares,CpuLimitMHZ,CpuReservationMHZ,NumMemShares,ReservationsMB,LimitMB,SnapshotCount,GuestOS
$Report.VMName = $VM.name
$Report.ESXname = $VM.Host
$Report.ClusterName = ($VM | Get-Cluster).Name
$Report.MemoryGB = $VM.MemoryMB/1024
$Report.vCPUcount = $VM.NumCpu
$Report.vNICcount = $VM.Guest.Nics.Count
$Report.IPaddresses = $VM.Guest.IPAddress
$Report.VmdkSizeGB = $VmdkSizeGB
$Report.TotalVmdkSizeGB = $TotalHardDisksSizeGB
$Report.DatastoreName = $VMview.Config.DatastoreUrl
$Report.ToolsVersion = $VMview.Config.Tools.ToolsVersion
$Report.ToolsUpdate = $VMview.Guest.ToolsStatus
$Report.NumCpuShares = $VMResourceConfiguration.NumCPUShares
$Report.CpuLimitMHZ = $VMResourceConfiguration.CpuLimitMhz
$Report.CpuReservationMHZ = $VMResourceConfiguration.CpuReservationMhz
$Report.NumMemShares = $VMResourceConfiguration.NumMemShares
$Report.ReservationsMB = $VMResourceConfiguration.MemReservationMB
$Report.LimitMB = $VMResourceConfiguration.MemLimitMB
$Report.SnapshotCount = (@($VM | Get-Snapshot)).Count
$Report.GuestOS = $VM.Guest.OSFullName
$NewObject += $Report
}
$NewObject | where-object {$_.ClusterName -eq "Test_Cluster"} | Select-Object -Property ClusterName,ESXName,Vmname,Memorygb,VCPUCount | sort -Property ESXName | Export-csv "$filelocation" -NoTypeInformation

Chris Nakagaki (Zsoldier)

http://tech.zsoldier.com

Message was edited by: Zsoldier

Chris Nakagaki (中垣浩一)
Blog: https://tech.zsoldier.com
Twitter: @zsoldier
0 Kudos