find.psm1

<#
    .NOTES
    ========================================================================
    Created by: Byran Schomburg
    Website: www.schomburg.dev
    Copyright: (c) 2025 Byran Schomburg. All rights reserved.
    ========================================================================
#>

#TODO: Located in /PC/find/
function get-fixed-drives {
    return $([System.IO.DriveInfo]::getdrives() | Where-Object {$_.DriveType -eq 'Fixed'}).rootdirectory.name
}

function find-folder {
<#
    .SYNOPSIS
    Searches for folders with a specific name.
    .DESCRIPTION
    Searches for a specific folder.
    You can add the '-exact' parameter to get folders that exactly match the search.
    You can also specify a path.
    .EXAMPLE
    PS> find-folder test
#>

    param (
        [string] $name = "default",
        [string] $path,
        [switch] $exact
    )
    if ($path) {
        $path = Join-Path -Path $path -ChildPath ""
        if ($exact) {
            $scriptBlock = [scriptblock]::Create("`$_.PSIsContainer -eq `$true -and `$_.Name -eq `"$name`"")
            Get-ChildItem -LiteralPath $path -Recurse -force -EA 0 | Where $scriptBlock | Select Fullname
        }
        else {
            $name = "*$name*"
            $scriptBlock = [scriptblock]::Create("`$_.PSIsContainer -eq `$true -and `$_.Name -like `"$name`"")
            Get-ChildItem -LiteralPath $path -Recurse -force -EA 0 | Where $scriptBlock | Select Fullname
        }
    }
    else {
        $drives = get-fixed-drives
        if ($exact) {
            $scriptBlock = [scriptblock]::Create("`$_.PSIsContainer -eq `$true -and `$_.Name -eq `"$name`"")
            foreach($drive in $drives){
                Get-ChildItem -LiteralPath $drive -Recurse -force -EA 0 | Where $scriptBlock | Select Fullname
            }
        }
        else {
            $name = "*$name*"
            $scriptBlock = [scriptblock]::Create("`$_.PSIsContainer -eq `$true -and `$_.Name -like `"$name`"")
            foreach($drive in $drives){
                Get-ChildItem -LiteralPath $drive -Recurse -force -EA 0 | Where $scriptBlock | Select Fullname
            }
        }
    }
}
function find-file {
<#
    .SYNOPSIS
    Searches for files with a specific name.
    .DESCRIPTION
    Searches for a specific file.
    You can add the '-exact' parameter to get files that exactly match the search.
    You can also specify a path.
    .EXAMPLE
    PS> find-file test
#>

    param (
        [string] $name = "default",
        [string] $path,
        [switch] $exact
    )
    if ($path) {
        $path = Join-Path -Path $path -ChildPath ""
        if ($exact) {
            $scriptBlock = [scriptblock]::Create("`$_.Name -eq `"$name`"")
            Get-ChildItem -LiteralPath $path -Recurse -Force -EA 0 | Where $scriptBlock | Select Fullname
        }
        else {
            $name = "*$name*"
            $scriptBlock = [scriptblock]::Create("`$_.Name -like `"$name`"")
        $drives = $([System.IO.DriveInfo]::getdrives() | Where-Object {$_.DriveType -eq 'Fixed'}).rootdirectory.name
        }
    }
    else {
        $drives = if ($path) { @($path) } else { get-fixed-drives }
        if ($exact) {
            $scriptBlock = [scriptblock]::Create("`$_.Name -eq `"$name`"")
            foreach($drive in $drives){
                Get-ChildItem -LiteralPath $drive -Recurse -Force -EA 0 | Where $scriptBlock | Select Fullname
            }
        }
        else {
            $name = "*$name*"
            $scriptBlock = [scriptblock]::Create("`$_.Name -like `"$name`"")
            foreach($drive in $drives){
                Get-ChildItem -LiteralPath $drive -Recurse -Force -EA 0 | Where $scriptBlock | Select Fullname
            }
        }
    }
}
Export-ModuleMember -function *

# SIG # Begin signature block
# MIIFpgYJKoZIhvcNAQcCoIIFlzCCBZMCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB8pcTdrJKVYiZk
# 15gDogjY82FKVx8gvREr+cpxdm6m/qCCAx4wggMaMIICAqADAgECAhAyQLVt3L/9
# i0NfCldSuaRBMA0GCSqGSIb3DQEBCwUAMBgxFjAUBgNVBAMMDUJTLVcxMU0tU0NI
# T00wHhcNMjUwMTI4MTEwMTIyWhcNMjYwMTI4MTEyMTIyWjAYMRYwFAYDVQQDDA1C
# Uy1XMTFNLVNDSE9NMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtJt0
# QuCyfwAyWKZW/iSiDzUn1KMGe3y3OnLfaQaLzxI+MjoZBOoA3uYLOBphX/CeUPKy
# fil2xPKsvpgC33QI+mnfpOnezzUt8XB58VkWENQiO842Uczw7wVUDf5n0uZ8ki5U
# K2pwbP6yayFgv8S7toCsxm1P2l0cGYRKu76IPuRxbWiLmersuUibVC1WQCq78OkT
# rWJMCAaMlZJ/EBu0FZ97kPhBNf7R5U2quaftlRsz0FxafJIrn4SA+UFLWAx3/2tI
# 8VhTmTnXfFvaYu59vxwNUdvrcaYfC7W0tNjsuD5OzCTlZK3nLAtbqIbMUtF1HJVJ
# WJCveBWPFA3jjOzaAQIDAQABo2AwXjAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAww
# CgYIKwYBBQUHAwMwGAYDVR0RBBEwD4INQlMtVzExTS1TQ0hPTTAdBgNVHQ4EFgQU
# kdGu2/UyLYYJq20ttdSSY2/DHGMwDQYJKoZIhvcNAQELBQADggEBACPZYnQEVJJn
# MUR6bv0/2YPDw5+/ECGwvNNbepLg2t4esgkV8rie+cNyrM3rUI4a/5I1OH9HTFvI
# yX72/eDYzrszKu9YlvvXHNwOHgNMjvbaKYUS5c+W+OE+YwO0rzTQLn0QBrXefAWd
# Zf+ifTfGPT7bUa9UbQunQj4qqTiccBaRS4yHS7c2pW9DEQJXUEcCJ+hMoFb6ddWu
# rzuhGD+StQ5ngyriVjA005oge8iYb0Q9wfnkzLM37RgZWipzyZngkTYzOZz5CiPg
# CfmwX3QpJy64P0dS23QYPShGx2A9Vr6uBpfXJ6LYgzifZbrw0DTo60XaN7YPHpkr
# LpIkHls3NlkxggHeMIIB2gIBATAsMBgxFjAUBgNVBAMMDUJTLVcxMU0tU0NIT00C
# EDJAtW3cv/2LQ18KV1K5pEEwDQYJYIZIAWUDBAIBBQCggYQwGAYKKwYBBAGCNwIB
# DDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEE
# AYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQguvYRSf69Z2Fz
# Aib9eAzwOljDwyxoXefWDd5LdpqHZYUwDQYJKoZIhvcNAQEBBQAEggEAb8MZJmJ0
# eg36hz/MliJ0ZUvpiBIgdHHdjhEJXDU50/tF08PkZNqcT6SVXtVYcgnQQVLryLI2
# hfhZQZ/gwkjCnMdjkwXkZ+V7vxir9Z+bncniocImJmDgYDriKhFn1JbAIUiPdGsk
# ov5jQeLmOKffDWyEwr6zcvMjPc1+qM82UtXHkZyklX3y4XEvl2y3rtOFPj+0qKuZ
# RMLTrlX3Gvd4TH+Jb/o5uURZ1BF7jfz2mvVTxDasiRzhxmroD+tOwjI3cqi96V7j
# diQ/ZmGMy7i/nIZgejaAZMIBEpdCpqBG400cCDoALfaKes3RTtDZZQFz12o/NsNK
# mckeD3zmAIDhyA==
# SIG # End signature block