Public/New-OSBMediaISO.ps1

<#
.SYNOPSIS
Creates an ISO of any OSBuilder Media

.DESCRIPTION
Creates an ISO of any OSBuilder Media (OSMedia, OSBuilds, PEBuilds)

.LINK
https://www.osdeploy.com/osbuilder/docs/functions/media/new-osbmediaiso

.PARAMETER FullName
Full Path of the OSBuilder Media
#>

function New-OSBMediaISO {
    [CmdletBinding()]
    PARAM (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string[]]$FullName
    )

    BEGIN {
        #Write-Host '========================================================================================' -ForegroundColor DarkGray
        #Write-Host "$($MyInvocation.MyCommand.Name) BEGIN" -ForegroundColor Green

        #===================================================================================================
        Write-Verbose '19.1.1 Initialize OSBuilder'
        #===================================================================================================
        Get-OSBuilder -CreatePaths -HideDetails

        #===================================================================================================
        Write-Verbose '19.1.1 Gather All OS Media'
        #===================================================================================================
        $AllOSMedia = @()
        $AllOSMedia = $(Get-OSMedia)

        
        $AllOSBuild = @()
        $AllOSBuild = $(Get-OSBuild)

        
        $AllPEBuild = @()
        $AllPEBuild = $(Get-PEBuild)

        $AllOSBMedia = @()
        $AllOSBMedia = $AllOSMedia + $AllOSBuild + $AllPEBuild

        #$AllOSBMedia = $(Get-OSMedia) + $(Get-OSBuild) + $(Get-PEBuild)

        #===================================================================================================
        Write-Verbose '19.1.1 Locate OSCDIMG'
        #===================================================================================================
        if (Test-Path "$OSBuilderContent\Tools\$env:PROCESSOR_ARCHITECTURE\Oscdimg\oscdimg.exe") {
            $oscdimg = "$OSBuilderContent\Tools\$env:PROCESSOR_ARCHITECTURE\Oscdimg\oscdimg.exe"
        } elseif (Test-Path "C:\Program Files\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\$env:PROCESSOR_ARCHITECTURE\Oscdimg\oscdimg.exe") {
            $oscdimg = "C:\Program Files\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\$env:PROCESSOR_ARCHITECTURE\Oscdimg\oscdimg.exe"
        } elseif (Test-Path "C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\$env:PROCESSOR_ARCHITECTURE\Oscdimg\oscdimg.exe") {
            $oscdimg = "C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\$env:PROCESSOR_ARCHITECTURE\Oscdimg\oscdimg.exe"
        } else {
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Warning "Could not locate OSCDIMG in Windows ADK at:"
            Write-Warning "${env:ProgramFiles(x86)}\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\oscdimg.exe"
            Write-Warning "You can optionally copy OSCDIMG to:"
            Write-Warning "$OSBuilderContent\Tools\$env:PROCESSOR_ARCHITECTURE\Oscdimg\oscdimg.exe"
            Break
        }
        Write-Verbose "OSCDIMG: $oscdimg"
    }

    PROCESS {
        Write-Host '========================================================================================' -ForegroundColor DarkGray
        Write-Host "$($MyInvocation.MyCommand.Name) PROCESS" -ForegroundColor Green

        #===================================================================================================
        Write-Verbose '19.1.1 Select Source OSMedia'
        #===================================================================================================
        $SelectedOSMedia = @()

        if ($FullName) {
            foreach ($Item in $FullName) {
                Write-Verbose "Checking $Item"
                $SelectedOSMedia += $AllOSBMedia | Where-Object {$_.FullName -eq $Item}
            }
        } else {
            $SelectedOSMedia = $AllOSBMedia | Out-GridView -Title "OSBuilder: Select one or more OSMedia to create an ISO and press OK (Cancel to Exit)" -PassThru
        }

        #===================================================================================================
        Write-Verbose '19.1.1 Process OSMedia'
        #===================================================================================================
        foreach ($Media in $SelectedOSMedia) {
            $ISOSourceFolder = "$($Media.FullName)\OS"
            $ISODestinationFolder = "$($Media.FullName)\ISO"
            if (!(Test-Path $ISODestinationFolder)) {New-Item $ISODestinationFolder -ItemType Directory -Force | Out-Null}
            #$ISOFile = "$ISODestinationFolder\$($Media.Name).iso"

            $WindowsImage = Get-Content -Path "$($Media.FullName)\info\json\Get-WindowsImage.json"
            $WindowsImage = $WindowsImage | ConvertFrom-Json

            $OSImageDescription = $($WindowsImage.ImageName)
            
            $OSArchitecture = $($WindowsImage.Architecture)
            if ($OSArchitecture -eq '0') {$OSArchitecture = 'x86'}
            if ($OSArchitecture -eq '6') {$OSArchitecture = 'ia64'}
            if ($OSArchitecture -eq '9') {$OSArchitecture = 'x64'}
            if ($OSArchitecture -eq '12') {$OSArchitecture = 'x64 ARM'}

            $UBR = $($WindowsImage.UBR)

            $OSImageName = $OSImageDescription
        
            $OSImageName = $OSImageName -replace "Microsoft Windows Recovery Environment", "WinPE"
            $OSImageName = $OSImageName -replace "Windows 10", "Win10"
            $OSImageName = $OSImageName -replace "Enterprise", "Ent"
            $OSImageName = $OSImageName -replace "Education", "Edu"
            $OSImageName = $OSImageName -replace "Virtual Desktops", "VD"
            $OSImageName = $OSImageName -replace " for ", " "
            $OSImageName = $OSImageName -replace "Workstations", "Wks"
            $OSImageName = $OSImageName -replace "Windows Server 2016", "Svr2016"
            $OSImageName = $OSImageName -replace "Windows Server 2019", "Svr2019"
            $OSImageName = $OSImageName -replace "ServerStandardACore", "Std Core"
            $OSImageName = $OSImageName -replace "ServerDatacenterACore", "DC Core"
            $OSImageName = $OSImageName -replace "ServerStandardCore", "Std Core"
            $OSImageName = $OSImageName -replace "ServerDatacenterCore", "DC Core"
            $OSImageName = $OSImageName -replace "ServerStandard", "Std"
            $OSImageName = $OSImageName -replace "ServerDatacenter", "DC"
            $OSImageName = $OSImageName -replace "Standard", "Std"
            $OSImageName = $OSImageName -replace "Datacenter", "DC"
            $OSImageName = $OSImageName -replace 'Desktop Experience', 'DTE'
            $OSImageName = $OSImageName -replace '\(', ''
            $OSImageName = $OSImageName -replace '\)', ''

            if ($($Media.FullName) -like "*PEBuilds*") {
                $OSImageName = "WinPE $OSArchitecture $UBR"
                $ISOFile = "$ISODestinationFolder\WinPE $OSArchitecture $UBR.iso"
            } elseif ($($Media.FullName) -like "*OSMedia*") {
                if ($OSImageName -like "*Win10*") {
                    $OSImageName = "OSMedia Win10 $OSArchitecture $UBR"
                    $ISOFile = "$ISODestinationFolder\OSMedia Win10 $OSArchitecture $UBR.iso"
                } elseif ($OSImageName -like "*2016*") {
                    $OSImageName = "OSMedia Svr2016 $OSArchitecture $UBR"
                    $ISOFile = "$ISODestinationFolder\OSMedia Svr2016 $OSArchitecture $UBR.iso"
                } elseif ($OSImageName -like "*2019*") {
                    $OSImageName = "OSMedia Svr2019 $OSArchitecture $UBR"
                    $ISOFile = "$ISODestinationFolder\OSMedia Svr2019 $OSArchitecture $UBR.iso"
                } else {
                    $OSImageName = "OSMedia WinOS $OSArchitecture $UBR"
                    $ISOFile = "$ISODestinationFolder\OSMedia WinOS $OSArchitecture $UBR.iso"
                }
            } elseif ($($Media.FullName) -like "*OSBuilds*") {
                if ($OSImageName -like "*Win10*") {
                    $OSImageName = "OSBuild Win10 $OSArchitecture $UBR"
                    $ISOFile = "$ISODestinationFolder\OSBuild Win10 $OSArchitecture $UBR.iso"
                } elseif ($OSImageName -like "*2016*") {
                    $OSImageName = "OSBuild Svr2016 $OSArchitecture $UBR"
                    $ISOFile = "$ISODestinationFolder\OSBuild Svr2016 $OSArchitecture $UBR.iso"
                } elseif ($OSImageName -like "*2019*") {
                    $OSImageName = "OSBuild Svr2019 $OSArchitecture $UBR"
                    $ISOFile = "$ISODestinationFolder\OSBuild Svr2019 $OSArchitecture $UBR.iso"
                } else {
                    $OSImageName = "OSBuild WinOS $OSArchitecture $UBR"
                    $ISOFile = "$ISODestinationFolder\OSBuild WinOS $OSArchitecture $UBR.iso"
                }
            }

            # 32 character limit for a Label
            # 23 = Win10 Edu x64 17134.112
            # 25 = Win10 Edu N x64 17134.112
            # 23 = Win10 Ent x64 17134.112
            # 25 = Win10 Ent N x64 17134.112
            # 23 = Win10 Pro x64 17134.112
            # 27 = Win10 Pro Edu x64 17134.112
            # 29 = Win10 Pro EduN x64 17134.112
            # 27 = Win10 Pro Wks x64 17134.112
            # 26 = Win10 Pro N x64 17134.112
            # 29 = Win10 Pro N Wks x64 17134.112
            $ISOLabel = '-l"{0}"' -f $OSImageName
            $ISOFolder = "$($Media.FullName)\ISO"
            if (!(Test-Path $ISOFolder)) {New-Item -Path $ISOFolder -ItemType Directory -Force | Out-Null}

            if (!(Test-Path $ISOSourceFolder)) {
                Write-Warning "Could not locate $ISOSourceFolder"
                Write-Warning "Make sure you have proper OS before using New-OSBMediaISO"
                Return
            }
            $etfsboot = "$ISOSourceFolder\boot\etfsboot.com"
            if (!(Test-Path $etfsboot)) {
                Write-Warning "Could not locate $etfsboot"
                Write-Warning "Make sure you have proper OS before using New-OSBMediaISO"
                Return
            }
            $efisys = "$ISOSourceFolder\efi\microsoft\boot\efisys.bin"
            if (!(Test-Path $efisys)) {
                Write-Warning "Could not locate $efisys"
                Write-Warning "Make sure you have proper OS before using New-OSBMediaISO"
                Return
            }
            Write-Host "Label: $OSImageName" -ForegroundColor Cyan
            Write-Host "Creating: $ISOFile" -ForegroundColor Cyan
            $data = '2#p0,e,b"{0}"#pEF,e,b"{1}"' -f $etfsboot, $efisys
            start-process $oscdimg -args @("-m","-o","-u2","-bootdata:$data",'-u2','-udfver102',$ISOLabel,"`"$ISOSourceFolder`"", "`"$ISOFile`"") -Wait
        }
    }

    END {
        #Write-Host '========================================================================================' -ForegroundColor DarkGray
        #Write-Host "$($MyInvocation.MyCommand.Name) END" -ForegroundColor Green
    }
}