internal/functions/Get-DbopsFile.ps1

function Get-DbopsFile {
    [CmdletBinding()]
    Param (
        [object[]]$Path,
        [bool]$Absolute = ($Absolute -eq $true),
        [bool]$Relative = ($Relative -eq $true),
        [bool]$Recurse = ($NoRecurse -ne $true),
        [string[]]$Match = $Match
    )
    Function Select-DbopsFile {
        Param (
            [System.IO.FileSystemInfo]$Item,
            [System.IO.FileSystemInfo]$Root
        )
        Write-PSFMessage -Level Debug -Message "Getting child items from $Item; Root defined as $Root"
        $fileItems = Get-ChildItem $Item.FullName
        if ($Match) { $fileItems = $fileItems | Where-Object Name -match ($Match -join '|') }
        foreach ($childItem in $fileItems) {
            if ($childItem.PSIsContainer) {
                if ($Recurse) { Select-DbopsFile -Item (Get-Item $childItem.FullName) -Root $Root }
            }
            else {
                if ($Relative) {
                    $pkgPath = Resolve-Path $childItem.FullName -Relative
                }
                elseif ($Absolute) {
                    $pkgPath = $childItem.FullName
                }
                elseif ($Root) {
                    $pkgPath = $childItem.FullName -replace "^$([Regex]::Escape($Root.FullName))", '.'
                }
                else {
                    $pkgPath = $childItem.Name
                }
                # replace ^.\ ^./ ^\\ and :
                $slash = [IO.Path]::DirectorySeparatorChar
                $slashRegex = [Regex]::Escape(".$slash")
                $pkgPath = $pkgPath -replace "^$slashRegex|^\\\\", ''
                [DBOpsFile]::new($childItem, $pkgPath, $true)
            }
        }
    }
    foreach ($p in $Path) {
        if ($p.GetType() -in @([System.IO.FileSystemInfo], [System.IO.FileInfo])) {
            Write-PSFMessage -Level Verbose -Message "Item $p ($($p.GetType())) is a File object"
            $stringPath = $p.FullName
        }
        else {
            Write-PSFMessage -Level Verbose -Message "Item $p ($($p.GetType())) will be treated as a string"
            $stringPath = [string]$p
        }
        if (!(Test-Path $stringPath)) {
            Stop-PSFFunction -EnableException $true -Message "The following path is not valid: $stringPath"
            return
        }
        $fileItems = Get-Item $stringPath -ErrorAction Stop
        foreach ($currentItem in $fileItems) {
            if ($currentItem.PSIsContainer) {
                Select-DbopsFile -Item $currentItem -Root $currentItem.Parent
            }
            else {
                Select-DbopsFile -Item $currentItem -Root $currentItem.Directory
            }
        }
    }
}