New-OSBuilderISO.ps1

function New-OSBuilderISO {
    [CmdletBinding()]
    Param ()
    BEGIN {
        if (-not $PSBoundParameters.ContainsKey('Confirm')) {$ConfirmPreference = $PSCmdlet.SessionState.PSVariable.GetValue('ConfirmPreference')}
        if (-not $PSBoundParameters.ContainsKey('WhatIf')) {$WhatIfPreference = $PSCmdlet.SessionState.PSVariable.GetValue('WhatIfPreference')}
    }
    PROCESS {
        Get-OSBuilder -CreatePaths -HideDetails
        Write-Host ""
        #======================================================================================
        # Locate OSCDIMG
        #======================================================================================
        if ($env:PROCESSOR_ARCHITECTURE -eq 'AMD64') {
            if (Test-Path "${env:ProgramFiles(x86)}\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\oscdimg.exe"){
                $oscdimg = "${env:ProgramFiles(x86)}\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\oscdimg.exe"
            } else {
                Write-Warning "Could not locate OSCDIMG"
                Write-Warning "${env:ProgramFiles(x86)}\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\oscdimg.exe"
                Write-Warning "Make sure you have Windows ADK installed before using New-OSBuilderISO"
                Return
            }
        } else {
            Write-Warning "New-OSBuilderISO requires Windows 10 x64"
            Return
        }
        #======================================================================================
        # Validate OSMedia and OSBuilds has content
        #======================================================================================
        $SelectedOSMedia = Get-ChildItem -Path ("$OSBuildsPath","$OSMediaPath") -Directory | Select-Object -Property Parent, Name, FullName, CreationTime
        if ($null -eq $SelectedOSMedia) {
            Write-Warning "OSMedia or OSBuilds content not found. Use Import-OSMedia to import an Operating System first . . . Exiting!"
            Break
        }
        #======================================================================================
        # Validate OSMedia has an install.wim
        #======================================================================================
        $SelectedOSMedia = $SelectedOSMedia | Where-Object {Test-Path $(Join-Path $_.FullName (Join-Path "OS" (Join-Path "sources" "install.wim")))}
        if ($null -eq $SelectedOSMedia) {
            Write-Warning "OSMedia or OSBuilds Install.wim not found. Use Import-OSMedia to import an Operating System first . . . Exiting!"
            Break
        }
        #======================================================================================
        # Validate OSMedia was imported with Import-OSMedia
        #======================================================================================
        $SelectedOSMedia = $SelectedOSMedia | Where-Object {Test-Path $(Join-Path $_.FullName "WindowsImage.txt")}
        if ($null -eq $SelectedOSMedia) {
            Write-Warning "OSMedia or OSBuilds content invalid (missing WindowsImage.txt). Use Import-OSMedia to import an Operating System first . . . Exiting!"
            Return
        }
        #======================================================================================
        # Select Source OSMedia
        #======================================================================================
        $SelectedOSMedia = $SelectedOSMedia | Out-GridView -Title "Select one or more OSMedia or OSBuilds to create an ISO's and press OK (Cancel to Exit)" -PassThru
        if($null -eq $SelectedOSMedia) {
            Write-Warning "Source OSMedia or OSBuild was not selected . . . Exiting!"
            Return
        }

        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'}
            elseif ($OSArchitecture -eq 1) {$OSArchitecture = 'MIPS'}
            elseif ($OSArchitecture -eq 2) {$OSArchitecture = 'Alpha'}
            elseif ($OSArchitecture -eq 3) {$OSArchitecture = 'PowerPC'}
            elseif ($OSArchitecture -eq 6) {$OSArchitecture = 'ia64'}
            elseif ($OSArchitecture -eq 9) {$OSArchitecture = 'x64'}
            $UBR = $($WindowsImage.UBR)
        
            $OSImageName = $OSImageName -replace "Windows 10", "Win10"
            $OSImageName = $OSImageName -replace "Enterprise", "Ent"
            $OSImageName = $OSImageName -replace "Education", "Edu"
            $OSImageName = $OSImageName -replace " for ", " "
            $OSImageName = $OSImageName -replace "Workstations", "Wks"
            $OSImageName = $OSImageName -replace "Windows Server 2016", "Svr2016"
            $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 '\)', ''

            # 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-OSBuilderISO"
                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-OSBuilderISO"
                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-OSBuilderISO"
                Return
            }
            Write-Host "Label: $OSImageName" -ForegroundColor Yellow
            Write-Host "Creating: $ISOFile" -ForegroundColor Yellow
            $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 Green
        Write-Host "Complete!" -ForegroundColor Green
        Write-Host "===========================================================================" -ForegroundColor Green
        #======================================================================================
    }
}