private/Get-OSDWSWinPEBuild.ps1

function Get-OSDWSWinPEBuild {
    [CmdletBinding()]
    param (
        [ValidateSet('amd64', 'arm64')]
        [System.String]
        $Architecture
    )

    begin {
        #=================================================
        $Error.Clear()
        Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] Start"
        #=================================================
        $BuildPath = $OSDWorkspace.paths.build_windows_pe
        Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] BuildPath: $BuildPath"

        $BuildItems = @()
        $BuildItems = Get-ChildItem -Path $BuildPath -Directory -ErrorAction SilentlyContinue | Select-Object -Property * | `
            Where-Object { Test-Path $(Join-Path $_.FullName 'WinPE-Media\sources\boot.wim') } | `
            Where-Object { Test-Path $(Join-Path $_.FullName '.core\id.json') } | `
            # Where-Object { Test-Path $(Join-Path $_.FullName '.core\winos-windowsimage.xml') } | `
            Where-Object { (Test-Path $(Join-Path $_.FullName '.core\winpe-windowsimage.xml')) -or (Test-Path $(Join-Path $_.FullName '.core\winre-windowsimage.xml')) } | `
            Where-Object { Test-Path $(Join-Path $_.FullName '.core\gv-buildmedia.xml') }

        $IndexXml = (Join-Path $BuildPath 'index.xml')
        $IndexJson = (Join-Path $BuildPath 'index.json')

        if ($BuildItems.Count -eq 0) {
            Write-Warning "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] OSDWorkspace WinPE Builds were not found"
            Write-Warning "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] Run Build-OSDWorkspaceWinPE to resolve this issue"
            
            if (Test-Path $IndexXml) {
                Remove-Item -Path $IndexXml -Force -ErrorAction SilentlyContinue | Out-Null
            }
            if (Test-Path $IndexJson) {
                Remove-Item -Path $IndexJson -Force -ErrorAction SilentlyContinue | Out-Null
            }
            return
        }
    }
    process {
        $WinPEBuilds = foreach ($BuildItem in $BuildItems) {
            #=================================================
            # Get-FullName
            #=================================================
            $BuildItemPath = $($BuildItem.FullName)
            #=================================================
            # Import Details
            #=================================================
            $InfoId = "$BuildItemPath\.core\id.json"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] InfoId: $InfoId"
            $ImportId = Get-Content $InfoId -Raw | ConvertFrom-Json
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] Id: $($ImportId.Id)"

            $InfoOS = "$BuildItemPath\.core\winos-windowsimage.xml"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] InfoOS: $InfoOS"
            $ClixmlOS = @()
            if (Test-Path $InfoOS) {
                $ClixmlOS = Import-Clixml -Path $InfoOS -ErrorAction SilentlyContinue
            }

            $InfoREG = "$BuildItemPath\.core\winpe-regcurrentversion.xml"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] InfoREG: $InfoREG"
            $ClixmlREG = @()
            $ClixmlREG = Import-Clixml -Path $InfoREG

            $InfoPE = "$BuildItemPath\.core\winpe-windowsimage.xml"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] InfoPE: $InfoPE"
            $ClixmlPE = @()
            $ClixmlPE = Import-Clixml -Path $InfoPE -ErrorAction SilentlyContinue

            $InfoRE = "$BuildItemPath\.core\winre-windowsimage.xml"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] InfoRE: $InfoRE"
            $ClixmlRE = @()
            if (Test-Path $InfoRE) {
                $ClixmlRE = Import-Clixml -Path $InfoRE -ErrorAction SilentlyContinue
            }

            $InfoBM = "$BuildItemPath\.core\gv-buildmedia.xml"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] InfoBM: $InfoBM"
            $ClixmlBM = @()
            $ClixmlBM = Import-Clixml -Path $InfoBM

            #=================================================
            # Use ClixmlPE as this exists for WinRE and ADK
            $OSArchitecture = $ClixmlPE.Architecture
            if ($OSArchitecture -eq '0') { $OSArchitecture = 'x86' }
            if ($OSArchitecture -eq '1') { $OSArchitecture = 'MIPS' }
            if ($OSArchitecture -eq '2') { $OSArchitecture = 'Alpha' }
            if ($OSArchitecture -eq '3') { $OSArchitecture = 'PowerPC' }
            if ($OSArchitecture -eq '5') { $OSArchitecture = 'ARM' }
            if ($OSArchitecture -eq '6') { $OSArchitecture = 'ia64' }
            if ($OSArchitecture -eq '9') { $OSArchitecture = 'amd64' }
            if ($OSArchitecture -eq '12') { $OSArchitecture = 'arm64' }
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] OSArchitecture: $OSArchitecture"

            #=================================================
            # Alternate method is for ADK compatibility
            if ($ClixmlOS) {
                $OSEditionId = $($ClixmlOS.EditionId)
                $OSInstallationType = $($ClixmlOS.InstallationType)
                $OSCreatedTime = [datetime]$ClixmlOS.CreatedTime
                $OSModifiedTime = [datetime]$ClixmlOS.ModifiedTime
                $OSImageName = $ClixmlOS.ImageName
                $OSVersion = "$($ClixmlOS.MajorVersion).$($ClixmlOS.MinorVersion).$($ClixmlOS.Build).$($ClixmlOS.SPBuild)"
            }
            else {
                $OSEditionId = $($ClixmlPE.EditionId)
                $OSInstallationType = $($ClixmlPE.InstallationType)
                $OSCreatedTime = [datetime]$ClixmlPE.CreatedTime
                $OSModifiedTime = [datetime]$ClixmlPE.ModifiedTime
                $OSImageName = $ClixmlPE.ImageName
                $OSVersion = "$($ClixmlPE.MajorVersion).$($ClixmlPE.MinorVersion).$($ClixmlPE.Build).$($ClixmlPE.SPBuild)"
            }
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] OSEditionId: $OSEditionId"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] OSInstallationType: $OSInstallationType"

            #=================================================
            # Alternate method is for ADK compatibility
            if ($ClixmlRE) {
                $WinREVersion = $($ClixmlRE.Version)
                $WinREMajorVersion = $($ClixmlRE.MajorVersion)
                $WinREMinorVersion = $($ClixmlRE.MinorVersion)
                $WinREBuild = $($ClixmlRE.Build)
                $WinRESPLevel = $($ClixmlRE.SPLevel)
                $WinRELanguages = $($ClixmlRE.Languages)
            }
            else {
                $WinREVersion = $($ClixmlPE.Version)
                $WinREMajorVersion = $($ClixmlPE.MajorVersion)
                $WinREMinorVersion = $($ClixmlPE.MinorVersion)
                $WinREBuild = $($ClixmlPE.Build)
                $WinRESPLevel = $($ClixmlPE.SPLevel)
                $WinRELanguages = $($ClixmlPE.Languages)
            }
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] WinREVersion: $WinREVersion"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] WinREMajorVersion: $WinREMajorVersion"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] WinREMinorVersion: $WinREMinorVersion"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] WinREBuild: $WinREBuild"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] WinRESPLevel: $WinRESPLevel"
            Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] Languages: $WinRELanguages"
            #=================================================
            # Create Object
            #=================================================
            $ObjectProperties = [ordered]@{
                Type                     = 'WinPE'
                Id                       = $ImportId.Id
                Name                     = $ClixmlBM.Name
                ModifiedTime             = [datetime]$ClixmlPE.ModifiedTime
                InstallationType         = $ClixmlPE.InstallationType
                Version                  = "$($ClixmlPE.MajorVersion).$($ClixmlPE.MinorVersion).$($ClixmlPE.Build).$($ClixmlPE.SPBuild)"
                DisplayVersion           = $ClixmlREG.DisplayVersion
                ReleaseId                = $ClixmlREG.ReleaseId
                Architecture             = $OSArchitecture
                Languages                = $ClixmlPE.Languages
                SetAllIntl               = $ClixmlBM.SetAllIntl
                InputLocale              = $ClixmlBM.SetInputLocale
                TimeZone                 = $ClixmlBM.SetTimeZone
                ContentStartnet          = $ClixmlBM.ContentStartnet
                ContentWinpeshl          = $ClixmlBM.ContentWinpeshl
                InstalledApps            = $ClixmlBM.InstalledApps
                AdkVersion               = $ClixmlBM.AdkInstallVersion
                BuildProfile             = $ClixmlBM.BuildProfile
                WinPEAppScript           = $ClixmlBM.WinPEAppScript
                WinPEScript              = $ClixmlBM.WinPEScript
                WinPEDriver              = $ClixmlBM.WinPEDriver
                WinPEMediaScript         = $ClixmlBM.WinPEMediaScript
                CreatedTime              = [datetime]$ClixmlPE.CreatedTime
                ImageName                = $ClixmlPE.ImageName
                ImagePath                = Join-Path $BuildItemPath 'Media\sources\boot.wim'
                ImageIndex               = [uint32]$ClixmlPE.ImageIndex
                ImageSize                = $ClixmlPE.ImageSize
                DirectoryCount           = $ClixmlPE.DirectoryCount
                FileCount                = $ClixmlPE.FileCount
                OSCreatedTime            = $OSCreatedTime
                OSModifiedTime           = $OSModifiedTime
                OSImageName              = $OSImageName
                OSEditionId              = $OSEditionId
                OSVersion                = $OSVersion
                Path                     = $BuildItemPath
            }
            New-Object -TypeName PSObject -Property $ObjectProperties
            $ObjectProperties | Export-Clixml -Path "$BuildItemPath\.core\object.xml" -Force
            $ObjectProperties | ConvertTo-Json -Depth 5 | Out-File -FilePath "$BuildItemPath\.core\object.json" -Encoding utf8 -Force
            $ObjectProperties | ConvertTo-Json -Depth 5 | Out-File -FilePath "$BuildItemPath\properties.json" -Encoding utf8 -Force
        }

        if ($WinPEBuilds) {
            # $WinPEBuilds | Export-Clixml -Path $IndexXml -Force
            $WinPEBuilds | ConvertTo-Json -Depth 5 | Out-File -FilePath $IndexJson -Encoding utf8 -Force

            if ($Architecture -eq 'amd64') {
                $WinPEBuilds = $WinPEBuilds | Where-Object { $_.Architecture -eq 'amd64' }
            }
            if ($Architecture -eq 'arm64') {
                $WinPEBuilds = $WinPEBuilds | Where-Object { $_.Architecture -eq 'arm64' }
            }
            if ($GridView) {
                $WinPEBuilds = $WinPEBuilds | Out-GridView -Title 'Select a BootMedia and press OK (Cancel to Exit)' -OutputMode $GridView
            }


            $WinPEBuilds = $WinPEBuilds | Sort-Object -Property ModifiedTime -Descending
            return $WinPEBuilds
        }
        else {
            return $null
        }
        #=================================================
    }
    end {
        #=================================================
        Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] End"
        #=================================================
    }
}