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;
VMware VirtualCenter server name #
####################################
$vcserver="localhost"
##################
Add VI-toolkit #
##################
Add-PSsnapin VMware.VimAutomation.Core
Initialize-VIToolkitEnvironment.ps1
connect-VIServer $vcserver
##################
Mail variables #
##################
$enablemail="No"
$smtpServer = "mymailserver.com"
$mailfrom = "Test VMware Status <NO-REPLY_@mydomain.com>"
$mailto = "Testvm@mydomain.com"
#############
Variables #
#############
$filelocation="D:\temp\healthcheck.csv"
$date=get-date
#############################
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.
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)
Message was edited by: Zsoldier
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.
Dave,
Thank you, but adding the look that you post did not help. It did not return any data in csv file.
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)
Message was edited by: Zsoldier