Public/Get-DRBackup.ps1

Function Get-DRBackup {
    <#
    .SYNOPSIS
    -Taylor Lee
    Modified 06122019
 
    .DESCRIPTION
    The purpose of this function is to provide records that would simplify bringing back up a large vcenter array in a recovery scenario.
 
    Get's Domain DNS Records, Hosts, and VM's, saves the Gatered data to 3 seperate spreadsheets, and prompts to Delete any files older than 45 days in the output path
 
    .EXAMPLE
    Specify the DNS Zone Name containg the VMware DNS Records.
    Specify a Domain Controller containing the Primary DNS Zone.
    Specify the folder where the records are to be saved.
    Specify the Vcenter Server hosting the VM's.
 
    Get-DRRecords -DNSZone DNSZone.com -PrimaryDNSServer DNSServer -OutPath c:\drbackup -Vcenter vcentername
 
    .NOTES
    Requires the VMware.PowerCLI Module
    Requires the ImportExcel Module
    #>


    [CmdletBinding(SupportsShouldProcess)]
    Param (
        [Parameter(Mandatory = $true)]
        [ValidateScript( { if ($_ -notlike "*.*") { throw "DNS zone must specificy the Top Level Domain of the Zone. Like '.com' in MYZone.com" } else { $true } })]
        $DNSZone,
        [Parameter(Mandatory = $true)]$PrimaryDNSServer,
        [Parameter(Mandatory = $true)]$OutPath,
        [Parameter(Mandatory = $true)]$VCenter
    )

    $Required = Get-Module importexcel
    if ($Required -eq $null) {
        Write-Warning "ImportExcel Module is Required"
    }

    else {
        #Get's DNS Records
        
        #Remove backslash from outpath variable to avoid outpath errors
        $Outpath = $Outpath.trimend("\")
        #Path Variables
        $date = Get-Date -format m
        $datepath = "$OutPath\$date DRBackup.xlsx"


        #Export Dns zone
        $results = Get-DnsServerResourceRecord -zonename $DNSZone -computername $PrimaryDNSServer | Select-Object hostname, Recordtype, timestamp, @{n = 'IP'; E = { $_.recorddata.IPV4Address } }
        $results | Export-Excel -WorksheetName "DNS" -Path "$datepath" -FreezeTopRow -TableName "$DNSZone" -AutoSize

        #connect to old vcenter
        Connect-VIServer -Server $VCenter

        #Get's vm list
        Get-VM * |
        Select-Object name, vmhost, @{N = "IP Address"; E = { @($_.guest.IPAddress -join '|') } }, NumCpu, CoresPerSocket, MemoryGB, Version, HardwareVersion, Notes |
        Export-Excel -WorksheetName "Virtual Machines" -Path "$datepath" -FreezeTopRow -TableName "Virtual Machines" -AutoSize

        #Get vmhosts
        Get-VMHost |
        Select-Object Name, @{n = "ManagementIP"; e = { Get-VMHostNetworkAdapter -VMHost $_ -VMKernel | Where-Object { $_.ManagementTrafficEnabled } | ForEach-Object { $_.Ip } } }, NumCpu, MemoryTotalGB, ProcessorType, LicenseKey, Version, Build |
        Export-Excel -WorksheetName "VM Hosts" -Path "$datepath" -FreezeTopRow -TableName "VMHosts" -AutoSize

        #Confirm the Function was successful by viewing the files have size to them
        Set-Location $OutPath
        Get-ChildItem | Sort-Object name -descending | Format-Table

        #Delete backup files older than 45 days
        Write-Host "WARNING: " -Foregroundcolor Red -NoNewline
        Write-Host "This will delete all files in the output path including those not generated by this function" -ForegroundColor Yellow
        $Prompt = Read-Host "Do you wish to delete all files in path older than 45 days? (yes/no)"

        if ($Prompt -eq 'yes') {
            cmd.exe /c forfiles /p "$OutPath" /d -7 /C "cmd /c del @path"
        }
        else {
            Write-Host "You selected No" -ForegroundColor Yellow
        }
    }
}