FileSystemSearch.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#region Variables
# Helper variable for BFS Search
$Queue = New-Object System.Collections.ArrayList
#endregion

#region New-FileSystemSearch
Function New-FileSystemSearch
{
    <#
    .SYNOPSIS
 
    Gets all directories under a path
 
    .DESCRIPTION
 
    The New-FileSystemSearch will get all the directories under a path using Breadth-Search-First or Depth-Search-First algorithms.
 
    .PARAMETER Path
 
    The path to search under.
 
    .PARAMETER Method
 
    The method to use. Available options are "BFS" and "DFS". If not specified, DFS will be used.
 
    .EXAMPLE
 
    New-FileSystemSearch -Path d:\tmp -Method DFS
 
    This will list all directories under D:\tmp using DFS
 
    #>


    Param
    (
        [Parameter(Mandatory=$true, Position=0)]
        [string]$Path,

        [Parameter(Mandatory=$false, Position=1)]
        [ValidateSet(“DFS”,”BFS”)] 
        [string]$Method = "DFS"
    )

    # Test if path exists
    if( -Not (Test-Path $Path))
    {
        Write-Error "Could not find path $Path!"
        return
    }

    # Get the full path
    $p = (Resolve-Path $Path).Path

    # Select the method
    if($Method -eq "BFS")
    {    $Queue.Clear()
        _BFS $p
    }
    if($Method -eq "DFS")
    {
        _DFS $p
    }
}
#endregion

#region Helper Functions
# DFS Search function
Function _DFS
{
    Param
    (
        [string]$Path
    )

    # Test if path exists
    if( -Not (Test-Path $Path))
    {
        Write-Error "Could not find path $Path!"
        return
    }

    # Get the full path
    $p = (Resolve-Path $Path).Path

    Write-Output $p

    $directories = Get-ChildItem -Path $p -Directory -Force

    foreach($d in $directories)
    {
        _DFS $d.fullname
    }
}

# BFS Search function
Function _BFS
{
    Param
    (
        [string]$Path
    )

    # Test if path exists
    if( -Not (Test-Path $Path))
    {
        Write-Error "Could not find path $Path!"
        return
    }

    # Get the full path
    $p = (Resolve-Path $Path).Path

    $Queue.Add($p) | Out-Null

    while($Queue.Count -gt 0)
    {
        $directories = Get-ChildItem -Path $Queue[0] -Directory -Force

        foreach($d in $directories)
        {
            $Queue.Add($d.FullName) | Out-Null
        }

        Write-Output $Queue[0]
        $Queue.RemoveAt(0)
    }
}
#endregion

#region Exports
Export-ModuleMember -Function New-FileSystemSearch
#endregion