Files
PowerCLI-Example-Scripts/Scripts/Get-VMSnapshotReport.ps1
Jimit G 246a887e84 Added VMsStatusReport file (#465)
* Added VMsStatusReport file

* fixed typo and added space before and after |

* Modified script to fuction with VIServerFilePath and OutPath parameters

* Refined help section

* Changed name from VMsStatusReport.ps1 to Get-VMSnapshotReport.ps1

* help documentation refined

* commit

* fomating corrections using prettier extension

* cmdletbinding correction

* added example and fixed parameter issue
2021-06-28 07:35:24 +03:00

172 lines
5.1 KiB
PowerShell

<#
.SYNOPSIS
Creates HTML report of snapshots , Poweroff and PoweredOn VMS
.DESCRIPTION
The purpose of the script is to get a list of all VM Snaphots, Powered On VMs and Powered Off VMs. Utilises css and converts to a good looking html report. HTML format highlights large/old snapshots. This can be scheduled via taks scheduler and emailed to administrators or uplaoded to an IIS web location.
.NOTES
Script name: VMsStatusReport.ps1
Created on: 20/06/2021
Author: Jimit Gohel, @PsJimKG
Dependencies: Along with PowerCli, this script also requires Don Jones EnhancedHTML2 module. https://www.powershellgallery.com/packages/EnhancedHTML2/2.1.0.1
===Tested Against Environment====
vSphere Version: 6.7
PowerCLI Version: PowerCLI 11.5.0
PowerShell Version: 5.1
OS Version: Windows 10
.INPUTS
VIServerFilePath
.OUTPUTS
html file named VMStatusReport.html
.PARAMETER VIServerFilePath
csv file path to list of viservers
.PARAMETER Outpath
Output path to html report.
.EXAMPLE
PS> Get-VMSnapshotReport -VIServerFilePath "C:\Temp\viservers.csv" -OutPath "C:\MyReports"
.EXAMPLE
PS> Get-VMSnapshotReport "C:\temp\viserverslist.csv" C:\VMReports"
#>
function Get-VMSnapshotReport {
[CmdletBinding()]
Param(
[Parameter(Mandatory = $True, Position = 1, ValueFromPipeline = $True)]
[ValidateNotNullOrEmpty()]
[string]$VIServerFilePath,
[Parameter(Mandatory = $True, Position = 2)]
[string]$OutPath
)
# path to CSV list of viservers
$viservers = (Get-Content "$VIServerFilePath")
Connect-VIServer $viservers
$CSS2 = "body {
color: #333333;
font-family: Tahoma;
font-size: 10pt;
}
h1 {
text-align: center;
}
h2 {
border-top: 1px solid #666666;
}
th {
font-weight: bold;
color: #eeeeee;
background-color: #333333;
cursor: pointer;
}
.odd {
background-color: #ffffff;
}
.even {
background-color: #bfbfbf;
}
.paginate_enabled_next,
.paginate_enabled_previous {
cursor: pointer;
border: 1px solid #222222;
background-color: #dddddd;
padding: 2px;
margin: 4px;
border-radius: 2px;
}
.paginate_disabled_previous,
.paginate_disabled_next {
color: #666666;
cursor: pointer;
background-color: #dddddd;
padding: 2px;
margin: 4px;
border-radius: 2px;
}
.dataTables_info {
margin-bottom: 4px;
}
.sectionheader {
cursor: pointer;
}
.sectionheader:hover {
color: red;
}
.grid {
width: 100%;
}
.smallgrid {
width: 50%;
}
.red {
color: #ff3333;
font-weight: bold;
}
.green {
background-color: #00cc44;
font-weight: bold;
}
"
#Capturing VMs data
$vms = Get-VM
#reportgeneratedtag
$reportgeneratedtag = (Get-Date -Format "dd MMMM yyyy HH:mm:ss")
#Capturing data for snapshots
$paramsSnapshotFragment = @{'As' = 'Table';
'PreContent' = '<h2>VM Snapshots</h2>';
'MakeTableDynamic' = $true;
'TableCssClass' = 'grid';
'Properties' = 'VM', @{Name = 'SnapshotName'; Expression = { $_.Name } }, 'Created', @{Name = 'AgeDays'; Expression = { ((New-TimeSpan -Start $_.Created -End (get-date)).Days) }; css = { if (((New-TimeSpan -Start $_.Created -End (get-date)).Days) -gt 120) { 'red' } } }, 'Description', @{name = 'SizeGB'; expression = { [math]::Round($_.sizegb, 2) }; css = { if ($_.sizegb -gt 100) { 'red' } } }, 'PowerState', 'IsCurrent', 'ParentSnapshot', 'Children'
}
$snapshots = $vms | Get-Snapshot | ConvertTo-EnhancedHTMLFragment @paramsSnapshotFragment
#PoweredOff
$paramsPoweredoff = @{'As' = 'Table';
'PreContent' = '<h2>Powered Off VMs</h2>';
'MakeTableDynamic' = $true;
'TableCssClass' = 'grid';
'Properties' = 'Name', 'PowerState', 'Notes' , 'Folder'
}
$poweredoffvms = $vms | Where-Object { $_.PowerState -ne 'PoweredOn' } | ConvertTo-EnhancedHTMLFragment @paramsPoweredoff
#PoweredOn
$paramsPoweredon = @{'As' = 'Table';
'PreContent' = '<h2>Powered On VMs</h2>';
'MakeTableDynamic' = $true;
'TableCssClass' = 'grid';
'Properties' = 'Name', 'PowerState', 'Notes' , 'Folder'
}
$poweredonvms = $vms | Where-Object { $_.PowerState -eq 'PoweredOn' } | ConvertTo-EnhancedHTMLFragment @paramsPoweredon
# Finalising main html report
$paramsMainHTML = @{
'HTMLFragments' = $reportgeneratedtag, $snapshots, $poweredoffvms, $poweredonvms
'CssStyleSheet' = $CSS2;
'Title' = 'VM Status Report';
'PreContent' = "<h1>VM Status Report</h1>"
}
ConvertTo-EnhancedHTML @paramsMainHTML | Out-File "$OutPath\VMStatusReport.html" -Encoding utf8
Disconnect-VIServer -Server $viservers -Force -Confirm:$false
}