Libraries/Bootloader/Includes/Bootloader.BCD.psm1

<#
.SYNOPSIS
Search for a bcd configuration
 
.DESCRIPTION
Search into local partition for a bcd.cfg file.
Default search for a "bcd.cfg" file. If config name is overriden, use -Filename to search for custom filename.
 
.EXAMPLE
Find-OSBootloaderBCDCfg -Path "/boot"
 
.EXAMPLE
Find-OSBootloaderBCDCfg -Path "/boot" -Filename "mybcd.cfg"
 
.NOTES
General notes
#>

function Find-OSBootloaderBCDCfg {
    [CmdletBinding()]
    [OutputType([String])]
    Param (
        # Path to start search
        [Parameter(Mandatory = $true, ValueFromPipeLine = $true)][string]$Path,
        # Custom filename to search for
        [Parameter(Mandatory = $false, ValueFromPipeLine = $false)][string]$Filename = "BCD",
        # Search as far as MaxDepth deep
        [Parameter(Mandatory = $false, ValueFromPipeLine = $false)][uint32]$MaxDepth = 3

    )
    Begin {
        Write-EnterFunction
    }

    Process {
        $bcdcfg = Get-ChildItem -Path $Path/EFI/Microsoft/Boot $Filename -Recurse -Depth $MaxDepth -ErrorAction SilentlyContinue
        return ${bcdcfg}?.fullname
    }

    End {
        Write-LeaveFunction
    }
}

function Set-OSBootloaderBCDDefaultBoot {
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    Param (
        [Alias('ConfigFile')]
        [Parameter(Mandatory = $false, ValueFromPipeLine = $false)][string]$BCDCfg = (Find-OSBootloaderbcdCfg -Path "/EFI"),
        [Parameter(Mandatory = $true, ValueFromPipeLine = $false)][string]$label
    )
    Begin {
        Write-EnterFunction
    }

    Process {
        $bcd = Get-BCD
        $bcdEntry = $bcd | Where-Object { $_.label -eq "$label" }
        Set-BCDDisplayOrder -id $bcdEntry.id -AddFirst
        return $?
    }

    End {
        Write-LeaveFunction
    }
}

function Get-OSBootloaderBCDBootEntries {
    [CmdletBinding()]
    [OutputType([String])]
    Param (
        # Custom filename to search on
        [Parameter(Mandatory = $false, ValueFromPipeLine = $false)][string]$Filename,

        # Show all entries label
        [Parameter(Mandatory = $false, ParameterSetName = 'ALL')][switch]$All
    )
    Begin {
        Write-EnterFunction
        $bcd = Get-BCD -Filename $Filename
    }

    Process {
        switch ($PSCmdlet.ParameterSetName) {
            'ID' {
                return ($bcd | Where-Object { $_.id -eq $Id })
            }
            'UEFILABEL' {
                # $id = ($bcd.keys | Where-Object { $bcd.$_.description -eq $UefiLabel })
                # return $bcd.$id
                return ($bcd | Where-Object { $_.label -eq $UefiLabel })
            }
            'KEYVALUE' {
                # $id = ($bcd.keys | Where-Object { $bcd.$_.$Key -eq $Value })
                # return $bcd.$id
                return ($bcd | Where-Object { $_.$Key -eq $Value })
            }
            default {
                # return only UEFI entries, not bootloader entries
                $bootmgr = Get-BCDEntryDetails -Id "{bootmgr}" -AsGUID
                return ($bcd | Where-Object { $_.id -in $bootmgr.displayorder })
            }
        }
    }

    End {
        Write-LeaveFunction
    }
}