For the next report I wanted to have a copy of the VM state.. so I wrote this script to dump out the details i required into excel

Its not the fastest script…. I know how to improve its performance but honestly its not something I run very often so a quick and dirty solution was fine with me…

So about the Report…

VM Tab

VM,UUID,DNSName,IPAddress,ConfiguredOS,RunningOS,VMVersion,PowerState,Template,vCPUS,vMEM,ProvisionedGB,UsedSpaceGB,VMCluster,CurrentESXHost,Datastore(s),ResourcePool,FolderPath,VMConfigFileVMToolsVersion,VMToolsStatus

VMDK Tab

VM,Datastore,VMDK,StorageFormat,Capacity

VMNetwork Tab

VM,Name,Id,NicID,Type,NetworkName,MacAddress,ConnectionState

to the script…

#v1.0 vMan.ch, 03.03.2016 - Dumps VM Information to XLSX (Needs performance improvement by using has tables etc... but does the job so meh..)
#Requires Module --> https://github.com/dfinke/ImportExcel
#Requires PowerCLI

#Variables
$vCenter = 'vc.vMan.ch'
$OutputPath = "d:\VC\$vCenter.xlsx"
$LogOutPutPath = "d:\VC\$vCenter.log"

#Functions

#Logging Function
Function Log([String]$message, [String]$LogType, [String]$LogFile){
    $date = Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
    $message = $date + "`t" + $LogType + "`t" + $message
    $message >> $LogFile
}



function LoadSnapins(){
    $snapinList = @( "VMware.VimAutomation.Core")

    $loaded = Get-PSSnapin -Name $snapinList -ErrorAction SilentlyContinue | % {$_.Name}
    $registered = Get-PSSnapin -Name $snapinList -Registered -ErrorAction SilentlyContinue | % {$_.Name}
    $notLoaded = $registered | ? {$loaded -notcontains $_}

    foreach ($snapin in $registered) {
        if ($loaded -notcontains $snapin) {
        Add-PSSnapin $snapin
        }
    }
}

# Connect to VC

Function ConnectVC($FunkVC, $FunkLogFileLoc){
    Log -Message "Connecting to VC: $FunkVC" -LogType "INFO" -LogFile $FunkLogFileLoc
    $Funkconnstat = Connect-VIServer -server $FunkVC
        if ($Funkconnstat){
            Log -Message "Connection succeeded to VC: $FunkVC" -LogType "INFO" -LogFile $FunkLogFileLoc
            Write-Host "Connection succeeded to VC: $FunkVC"
        }
        else{
            Log -Message "Failed to connect to VC: $FunkVC" -LogType "ERROR" -LogFile $FunkLogFileLoc
            Write-Host "Failed to connect to VC: $FunkVC"
        }
}

#Disconnect from VC

Function DisconnectVC($FunkDCVC, $FunkDCLogFileLoc){
    Log -Message "Disconnecting from VC: $FunkDCVC" -LogType "INFO" -LogFile $FunkDCLogFileLoc
    $DCFunkconnstat = Disconnect-VIServer -server $FunkDCVC -Force:$true -Confirm:$false
        if ($DCFunkconnstat){
            Log -Message "Connection to VC: $FunkDCVC Dropped" -LogType "INFO" -LogFile $FunkDCLogFileLoc
            Write-Host "Connection to VC: $FunkDCVC Dropped"
        }
        else{
            Log -Message "Failed to disconnect from to VC: $FunkDCVC GOD HELP US ALL!" -LogType "ERROR" -LogFile $FunkDCLogFileLoc
            Write-Host "Failed to disconnect from to VC: $FunkDCVC GOD HELP US ALL!"
        }
}

filter Get-FolderPath {
<#
.SYNOPSIS
  Collates the full folder path
.DESCRIPTION
  The function will find the full folder path returning a
  name and path
.NOTES
  Source:  Automating vSphere Administration

#>
    $_ | Get-View | % {
        $row = "" | select Name, Path
        $row.Name = $_.Name

        $current = Get-View $_.Parent
        $path = $_.Name
        do {
            $parent = $current
            if($parent.Name -ne "vm"){
             $path = $parent.Name + "\" + $path
            }
            $current = Get-View $current.Parent
        } while ($current.Parent -ne $null)
        
        $row.Path = $path.Replace('\'+[String]$row.Name,"")
        $row
    }
}

###############################################SCRIPT###############################################

LoadSnapins

ConnectVC $vCenter $LogOutPutPath

$VMList = Get-VM

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "1). Create Hash table for ID to Name"

$VMList | Sort-Object Id | ForEach-Object -Begin {
    $elements = @{}
} -Process {
    $elements.Add($_.Id,$_.Name)
}

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "1). Created Hash table for ID to Name"

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "2). Create Hash table for VM to FolderPath"

$VMList | Get-FolderPath | Sort-Object Name | ForEach-Object -Begin {
    $elementFolders = @{}
} -Process {
    $elementFolders.Add($_.Name,$_.Path)
}

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "2). Created Hash table for VM to FolderPath"

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "3). Create Hash table for VM to Cluster lookup"

$Clusters=get-view -ViewType ClusterComputeResource -Property Name,Host
$vms=Get-View -ViewType VirtualMachine -Property Name,Summary.Runtime.Host
$VMs|%{ [hashtable]$VmsToHostHash+=@{ $_.Name.ToString() = $_.Summary.Runtime.Host.ToString()}}
foreach ($cluster in $clusters ) {$cluster.Host | % { [hashtable]$HostToClusterHash+= @{$_.ToString()=$cluster.Name}} }

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "3). Created Hash table for VM to Cluster lookup"

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "4). Dumping all VMDK Data"

$VMDKData = @()

 foreach ($VM in $VMList){
	$VMDKs = $VM | get-HardDisk
	foreach ($VMDK in $VMDKs) {
		if ($VMDK -ne $null){
			$CapacityGB = $VMDK.CapacityKB/1024/1024
			$CapacityGB = [int]$CapacityGB
			$VMDKData += New-Object PSObject -Property @{

			    VM = $VM.Name
			    Datastore = $VMDK.FileName.Split(']')[0].TrimStart('[')
			    VMDK = $VMDK.FileName.Split(']')[1].TrimStart('[')
			    StorageFormat = $VMDK.StorageFormat
			    CapacityGB = $CapacityGB

            }
		}
	}

}

$VMDKData | sort-object VM | select VM,Datastore,VMDK,StorageFormat,CapacityGB | Export-Excel $OutputPath -WorkSheetname VMDK

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "4). Done Dumping all VMDK Data"

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "5). Dumping all Network Data"

$VMNet = Get-NetworkAdapter -VM $VMList | Sort-Object Id | select Name,Type,NetworkName,MacAddress,Id,ConnectionState 

$ReportNetwork = @()

 foreach ($VM in $VMNet){

        $ReportNetwork += New-Object PSObject -Property @{

            Name = $VM.Name
            Type = $VM.Type
            NetworkName = $VM.NetworkName
            MacAddress = $VM.MacAddress
            Id = ($vm.Id -split '/')[0]
            NicID = ($vm.Id -split '/')[1]
            ConnectionState = $VM.ConnectionState
        }
}

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "5). Done Dumping all Network Data"

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "6). Adding VM name to the Network Report by hash lookup"

$ReportNetwork | ForEach-Object {
    $_| Add-Member -MemberType NoteProperty -Name VM -Value $elements."$($_.Id)" -PassThru
} | sort-object VM | select VM,Name,NicID,Type,NetworkName,MacAddress,ConnectionState | Export-Excel $OutputPath -WorkSheetname VMNetwork

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "6). Added VM name to the Network Report by hash lookup"

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "7). Dumping all VM Data"

$Report = @()

ForEach ($VM in $VMList){

$View = Get-View $VM

    $Report += New-Object PSObject -Property @{

        Name = $VM.Name
        UUID = $View.config.uuid
        DNSName = $VM.ExtensionData.Guest.Hostname
        Template = $View.Config.Template
        PowerState = $VM.PowerState
        CurrentESXHost = $VM.VMHost
        VMCluster = $HostToClusterHash[$vmsToHostHash[$VM.Name]]
        Datastore = [String]$Datastores = (Get-Datastore -VM $VM).Name
        VMConfigFile = $View.Config.Files.VmPathName
        ProvisionedGB = [math]::Round($VM.ProvisionedSpaceGB)
        UsedSpaceGB = [math]::Round($VM.UsedSpaceGB)
        vCPUs = $VM.NumCpu
        vMEM_MB = $VM.MemoryMB
        VMToolsVersion = $View.Config.tools.ToolsVersion
        VMToolsStatus = $View.Guest.ToolsVersionStatus
        ResourcePool = $VM.ResourcePool.Name
        ConfiguredOS = $View.Config.GuestFullName
        RunningOS = $VM.Guest.OSFullName
        IPAddress = [String]$VM.Guest.IPAddress
        VMVersion = $VM.Version
    }
} 

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "7). Done Dumping all VM Data"

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "8). Adding FolderPath to each VM"

$Report | ForEach-Object {
    $_ | Add-Member -MemberType NoteProperty -Name FolderPath -Value $elementFolders."$($_.Name)" -PassThru
} | sort-object Name | select Name,UUID,DNSName,IPAddress,ConfiguredOS,RunningOS,VMVersion,PowerState,Template,vCPUs,vMEM_MB,ProvisionedGB,UsedSpaceGB,VMCluster,ResourcePool,CurrentESXHost,Datastore,FolderPath,VMConfigFile,VMToolsVersion,VMToolsStatus | Export-Excel $OutputPath  -WorkSheetname VM

Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
Write-host "8).Added FolderPath to each VM"


DisconnectVC $vCenter $LogOutPutPath

Remove-Variable *  -Force -ErrorAction SilentlyContinue