Hyper-V: Get VM Name, IP Address, VM Status output to HTML Report

Welcome Forums General PowerShell Q&A Hyper-V: Get VM Name, IP Address, VM Status output to HTML Report

This topic contains 3 replies, has 4 voices, and was last updated by

9 months, 2 weeks ago.

  • Author
  • #119917

    Topics: 2
    Replies: 0
    Points: 4
    Rank: Member


    # Variables
    $DateStamp = get-date -uformat "%m-%d-%Y"
    $file = "C:\Project6\CompletedScript\Report_$DATEStamp.txt"
    $VMS = get-vm
    $computers = $Env:COMPUTERNAME

    Write-Host "Collecting Data on the Servers" -ForegroundColor "Yellow"

    # put todays date and time in the file
    echo "Health Report was ran on" | out-file $file
    get-date | out-file $file -append

    # get the vhost uptime
    Get-CimInstance Win32_OperatingSystem -comp $computers | Select @{Name="VHostName";Expression={$_."csname"}},@{Name="Uptime = D:H:M:S.Millseconds";Expression={(Get-Date) – $_.LastBootUpTime}},LastBootUpTime | format-table -autosize | out-file $file -append

    # get the vhost name, total virtual CPU count, total RAM, virtualharddiskpath and virtualmachinepath
    Get-VMHost | Select @{Name="VHostName";Expression={$_."Name"}},@{N="Total RAM(GB)";E={""+ [math]::round($_.Memorycapacity/1GB)}},logicalprocessorcount,virtualharddiskpath,virtualmachinepath | format-table -autosize | out-file $file -append

    echo "VHOST Server IP Addresses and NIC's" | out-file $file -append
    Get-WMIObject win32_NetworkAdapterConfiguration | Where-Object { $_.IPEnabled -eq $true } | Select IPAddress,Description | format-table -autosize | out-file $file -append

    echo "VHOST Server drive C: Disk Space" | out-file $file -append
    # to get D: drive add ,D after C – E: drive ,E etc.
    Get-psdrive C | Select Root,@{N="Total(GB)";E={""+ [math]::round(($_.free+$_.used)/1GB)}},@{N="Used(GB)";E={""+ [math]::round($_.used/1GB)}},@{N="Free(GB)";E={""+ [math]::round($_.free/1GB)}} |format-table -autosize | out-file $file -append

    echo "VHosts virtual switch(s) information" | out-file $file -append
    get-vmswitch * | out-file $file -append

    echo "Total number of VM's on server" | out-file $file -append
    echo "——————————" | out-file $file -append
    $VMS.Count | out-file $file -append
    echo " " | out-file $file -append

    echo "NOTE: Nothing listed under DVD Media Path = Nothing mounted in DVD" | out-file $file -append
    $outputArray = @()
    foreach($VM in $VMS)
    $VMsRAM = [math]::round($VM.Memoryassigned/1GB)
    $VMsCPU = $VM.processorCount
    $VMsState = $VM.State
    $VMsStatus = $VM.Status
    $VMsUptime = $VM.Uptime
    $VMsAutomaticstartaction = $VM.Automaticstartaction
    $VMsIntegrationServicesVersion = $VM.IntegrationServicesVersion
    $VMsReplicationState = $VM.ReplicationState
    $VHDs = Get-VHD -VMId $VM.VMiD
    $VHDsGB = [math]::round($VHDs.FileSize/1GB)
    $VMDVD = Get-vmdvddrive -VMname $VM.VMname

    $output = new-object psobject
    $output | add-member noteproperty "VM Name" $VM.Name
    $output | add-member noteproperty "RAM(GB)" $VMsRAM
    $output | add-member noteproperty "vCPU" $VMsCPU
    $output | add-member noteproperty "State" $VMsState
    $output | add-member noteproperty "Status" $VMsStatus
    $output | add-member noteproperty "Uptime" $VMsUptime
    $output | add-member noteproperty "Start Action" $VMsAutomaticstartaction
    $output | add-member noteproperty "Integration Tools" $VMsIntegrationServicesVersion
    $output | add-member noteproperty "Replication State" $VMsReplicationState
    $output | add-member noteproperty "VHD Path" $VHDs.Path
    $output | add-member noteproperty "Size GB" $VHDsGB
    $output | add-member noteproperty "VHD Type" $VHDs.vhdtype
    $output | add-member noteproperty "VHD Format" $VHDs.vhdformat
    $output | add-member noteproperty "DVD Media Type" $VMDVD.dvdmediatype
    $output | add-member noteproperty "DVD Media Path" $VMDVD.path
    $outputArray += $output
    write-output $outputarray | sort "VM Name" | format-table * -autosize | out-string -width 600 | out-file $file -append

    Echo "VM's BIOS setting" | out-file $file -append
    get-vmbios * | sort "VMName" | Format-Table -autosize | out-file $file -append

    echo "VM's Virtual Switch name and IP address" | out-file $file -append
    get-vmnetworkadapter * | Select vmname,switchname,ipaddresses | sort "VMName" | format-table -autosize | out-file $file -append

    echo "VM's Snapshot and location" | out-file $file -append
    echo "If nothing is Listed below, then there are no Snapshots" | sort "VMName" | format-table -autosize | out-file $file -append
    get-vmsnapshot -vmname * | out-file $file -append

    #load the report in notepad
    notepad.exe "C:\Project6\CompletedScript\Report_$DATEStamp.txt"


    I have this script here that gets info off the vms I have running and the local host server but right now it just outputs to a text file. Can anyone point me in the right direction as to how I would start having this output to a nicer html file.

  • #119955

    Topics: 0
    Replies: 29
    Points: 283
    Team MemberHelping Hand
    Rank: Contributor

    Hey AlexMac14,

    First up, I suspect your "code" tags would work better as "pre" tags.

    Secondly, the quickest way to do so would be to use ConvertTo-HTML, which takes an InputObject (from the pipeline if you want) and converts it into a HTML table. You can prefix appropriate CSS / styling, and use -Fragment to create multiple sections and generate a full report before outputting it to a file for distribution.

  • #120036

    Senior Moderator
    Topics: 8
    Replies: 1004
    Points: 3,253
    Helping Hand
    Rank: Community Hero

    A quick example is below

    $Process = Get-Process | Select-Object -First 4 -Property Name,ID,handles | ConvertTo-Html -Fragment
    $Service = Get-Service | Select-Object -First 4 -Property Name,Status,DisplayName | ConvertTo-Html -Fragment
    ConvertTo-Html -Body ($Process+$Service) -Head "List of process and services"  > C:\Temp\test.html
    Start-Process C:\Temp\test.html

    When you use -Fragment, it creates only the html table section, then you finally add these two tables to one single html file. you can do many more for html using PowerShell.

  • #120546

    Topics: 8
    Replies: 1191
    Points: 646
    Helping Hand
    Rank: Major Contributor

    There is also a free eBook over here under Free Resources > eBook > Creating HTML Reports in Powershell

The topic ‘Hyper-V: Get VM Name, IP Address, VM Status output to HTML Report’ is closed to new replies.