PFCore-File.ps1

<#
 .Synopsis
  Get a list of path segments from the top to the root folder.
 
 .Description
  Get a list of path segments from the top to the root folder.
 
 .Example
   Get-ParentPathSegments "c:\windows\system32"
   #Should return
   # c:\windows\system32
   # c:\windows
   # c:
#>

function Get-ParentPathSegments
{
    Param
    (
        [Parameter(
            Mandatory = $true,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        $Path=$PSScriptRoot
    )

    $Item = Get-Item -Path $Path
    if ($Item.FullName -ne $Item.Root.FullName)
    {
        $Item.FullName
        Get-ParentPathSegments -Path $Item.Parent.FullName
    }
    else
    {
        $Item.FullName
    }
}
Export-ModuleMember -function Get-ParentPathSegments

#TODO: Perf, and why?
<#
 .Synopsis
  Get a list of directories & subdirectories matching the search criteria.
 
 .Description
  Get a list of directories & subdirectories matching the search criteria.
 
 .Example
   TODO: Fill this in
#>

function Find-ChildDirectories {
    [CmdletBinding()]
    Param (
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string[]]$Paths=$PSScriptRoot,
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $false,
            ValueFromPipelineByPropertyName = $false
        )]
        [string[]]$Excludes="",
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $false,
            ValueFromPipelineByPropertyName = $false
        )]
        [string[]]$ExcludeDirs="",
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        [string[]]$Includes=""
    )

    $excludedPaths = @()
    $pathsToSearch = @()
    $pathsToSearch = $pathsToSearch + @(Resolve-Path $Paths | Get-Item)
    $pathsToSearch = $pathsToSearch + @(Get-ChildItem $Paths -Directory | ForEach-Object { 
    #$pathsToSearch = Get-ChildItem $Paths -Recurse -Directory | ForEach-Object {
            $allowed = $true
            $searchPath = $_
            #$parentPathExcluded = (Get-ParentPath $searchPath.FullName | Where-Object { $ExcludeDirs -contains ($_ | Split-Path -Leaf) })
            $parentPathExcluded = (@($searchPath.FullName) | Where-Object { $ExcludeDirs -contains ($_ | Split-Path -Leaf) }) 
            if($parentPathExcluded)
            {
                #if($excludedPaths -notcontains $parentPathExcluded) {
                    $excludedPaths = $excludedPaths + @($parentPathExcluded)
                #}
                $allowed = $false
            }
            if ($allowed) {
                $searchPath
                Find-ChildDirectories -Paths "$($searchPath.FullName)" -Excludes $Excludes -ExcludeDirs $ExcludeDirs -Includes $Includes
            }
    })
    Write-Verbose "PathsToSearch: $($pathsToSearch.Count) Excluded: $($excludedPaths.Count)"
    return ($pathsToSearch | Select-Object -Unique)
}
Export-ModuleMember -function Find-ChildDirectories

#TODO: Perf, and why?
<#
 .Synopsis
  Get a list of files from the specified paths matching the search criteria.
 
 .Description
  Get a list of files from the specified paths matching the search criteria.
 
 .Example
   TODO: Fill this in
#>

function Find-ChildItems {
    [CmdletBinding()]
    Param (
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $false,
            ValueFromPipelineByPropertyName = $true
        )]
        [string[]]$Paths=$PSScriptRoot,
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $false,
            ValueFromPipelineByPropertyName = $false
        )]
        [string[]]$Excludes="",
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $false,
            ValueFromPipelineByPropertyName = $false
        )]
        [string[]]$ExcludeDirs="",
        [Parameter(
            Mandatory = $false,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true
        )]
        [string[]]$Includes=""
    )

    Write-Verbose "Searching paths for valid dirs: '$($Paths)' excluding '$($ExcludeDirs)' "
    $pathsToSearch = Find-ChildDirectories -Paths $Paths -ExcludeDirs $ExcludeDirs
    $files = $pathsToSearch | Foreach-Object { $path = $_.FullName; $Includes | Foreach-Object { Get-ChildItem (Join-Path $path $_) -Exclude $Excludes } }
    return ($files | Select-Object -Unique)
}
Export-ModuleMember -function Find-ChildItems