Public/Catalog/Get-CatalogHPPlatformList.ps1

<#
.SYNOPSIS
Converts the HP Platform list to a PowerShell Object. Useful to get the computer model name for System Ids
 
.DESCRIPTION
Converts the HP Platform list to a PowerShell Object. Useful to get the computer model name for System Ids
Requires Internet Access to download platformList.cab
 
 
.EXAMPLE
Get-CatalogHPPlatformList
Don't do this, you will get a big list.
 
.EXAMPLE
$Result = Get-CatalogHPPlatformList
Yes do this. Save it in a Variable
 
.EXAMPLE
Get-CatalogHPPlatformList | Out-GridView
Displays all the HP System Ids with the applicable computer model names in GridView
 
.LINK
https://osd.osdeploy.com/module/functions
 
.NOTES
#>

function Get-CatalogHPPlatformList {
    [CmdletBinding()]
    
    #=================================================
    # Paths
    #=================================================
    $CatalogState           = 'Online' #Online, Build, Local, Offline
    $CatalogOnlinePath      = 'https://ftp.hp.com/pub/caps-softpaq/cmit/imagepal/ref/platformList.cab'
    $CatalogBuildPath       = Join-Path $env:TEMP 'platformList.xml'
    $CatalogLocalPath          = Join-Path $env:TEMP 'CatalogHPPlatformList.xml'
    $CatalogOfflinePath     = "$($MyInvocation.MyCommand.Module.ModuleBase)\Files\Catalogs\CatalogHPPlatformList.xml"
    $CatalogLocalCabName      = [string]($CatalogOnlinePath | Split-Path -Leaf)
    $CatalogLocalCabPath     = Join-Path $env:TEMP $CatalogLocalCabName
    #=================================================
    # Test CatalogState Local
    #=================================================
    if (Test-Path $CatalogLocalPath) {

        #Get-Item to determine the age
        $GetItemCatalogLocalPath = Get-Item $CatalogLocalPath

        #If the local is older than 12 hours, delete it
        if (((Get-Date) - $GetItemCatalogLocalPath.LastWriteTime).TotalHours -gt 12) {
            Write-Verbose "Removing previous Offline Catalog"
        }
        else {
            $CatalogState = 'Local'
        }
    }
    #=================================================
    # Test CatalogState Online
    #=================================================
    if ($CatalogState -eq 'Online') {
        if (Test-WebConnection -Uri $CatalogOnlinePath) {
            #Catalog is online and can be downloaded
        }
        else {
            $CatalogState = 'Offline'
        }
    }
    #=================================================
    # CatalogState Online
    # Need to get the Online Catalog to Local
    #=================================================
    if ($CatalogState -eq 'Online') {
        Write-Verbose "Source: $CatalogOnlinePath"
        Write-Verbose "Destination: $CatalogLocalCabPath"
        (New-Object System.Net.WebClient).DownloadFile($CatalogOnlinePath, $CatalogLocalCabPath)

        #Make sure the file downloaded
        if (Test-Path $CatalogLocalCabPath) {
            Write-Verbose "Expand: $CatalogLocalCabPath"
            Expand "$CatalogLocalCabPath" "$CatalogBuildPath" | Out-Null

            if (Test-Path $CatalogBuildPath) {
                $CatalogState = 'Build'
            }
            else {
                Write-Verbose "Could not expand $CatalogLocalCabPath"
                $CatalogState = 'Offline'
            }
        }
        else {
            $CatalogState = 'Offline'
        }
    }
    #=================================================
    # CatalogState Build
    #=================================================
    if ($CatalogState -eq 'Build') {
        Write-Verbose "Reading the System Catalog at $CatalogBuildPath"
        [xml]$XmlCatalogContent = Get-Content $CatalogBuildPath -ErrorAction Stop
        $CatalogVersion = $XmlCatalogContent.ImagePal.DateLastModified | Get-Date -Format yy.MM.dd
        $Platforms = $XmlCatalogContent.ImagePal.Platform

        Write-Verbose "Building the System Catalog"
        
        $Result = foreach($platform in $Platforms){             
            $ObjectProperties = [Ordered]@{
                CatalogVersion            = $CatalogVersion
                SystemId                  = $platform.SystemId
                SupportedModel            = [array]($platform.ProductName.'#text')
                #LatestWin10SupportedBuild = $platform.OS | Sort-Object -Property OSBuildId -Descending | Select-Object -First 1 -ExpandProperty OSReleaseIdDisplay
            }
            New-Object -TypeName PSObject -Property $ObjectProperties
        }
        
    
        Write-Verbose "Exporting Offline Catalog to $CatalogLocalPath"
        $Result = $Result | Sort-Object -Property SystemId
        $Result | Export-Clixml -Path $CatalogLocalPath
    }
    #=================================================
    # CatalogState Local
    #=================================================
    if ($CatalogState -eq 'Local') {
        Write-Verbose "Reading the Local System Catalog at $CatalogLocalPath"
        $Result = Import-Clixml -Path $CatalogLocalPath
    }
    #=================================================
    # CatalogState Offline
    #=================================================
    if ($CatalogState -eq 'Offline') {
        Write-Verbose "Reading the Offline System Catalog at $CatalogOfflinePath"
        $Result = Import-Clixml -Path $CatalogOfflinePath
    }
    #=================================================
    # Compatible
    #=================================================
    if ($PSBoundParameters.ContainsKey('Compatible')) {
        $MyComputerProduct = Get-MyComputerProduct
        Write-Verbose "Filtering XML for items compatible with Product $MyComputerProduct"
        $Result = $Result | Where-Object {$_.SystemID -eq $MyComputerProduct}
    }
    #=================================================
    # Component
    #=================================================
    $Result | Sort-Object -Property SystemId
    #=================================================
}