Public/Functions/Find-TextInModule.ps1

function Find-TextInModule {
    <#
    .SYNOPSIS
    Searches module files for matching text.
 
    .DESCRIPTION
    Resolves the latest installed version of a module, searches its files for matching text, shows results in Out-GridView, and opens selected files in Visual Studio Code when available.
 
    .PARAMETER Text
    Text pattern to search for in module files.
 
    .PARAMETER Module
    Module name to search. The latest installed version is selected.
 
    .PARAMETER Include
    File include pattern(s) used by Get-ChildItem during the recursive search.
 
    .EXAMPLE
    Find-TextInModule -Text Save-WebFile -Module OSD -Include *.ps1
    Searches PowerShell files in the latest installed OSD module for Save-WebFile.
 
    .LINK
    https://github.com/OSDeploy/OSD/tree/master/docs
 
    .NOTES
    Author: David Segura - Recast Software
    2026-07-11 - Added comment-based help
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]$Text,
        [string]$Module = 'OSD',
        [string[]]$Include = '*.*'
    )
    #=================================================
    # Get-Module Path
    #=================================================
    $GetModule = @()
    $GetModule = Get-Module -ListAvailable -Name $Module | Select-Object Name, Version, ModuleBase
    $GetModule = $GetModule | Sort-Object Name, Version -Descending | Group-Object Name | ForEach-Object {$_.Group | Select-Object -First 1}

    if ($null -eq $GetModule) {
        Write-Warning "Unable to find Module in Get-Module -ListAvailable -Name '$Module'"
    }
    else {
        Write-Verbose "Module Name: $($GetModule.Name)"
        Write-Verbose "Module Version: $($GetModule.Version)"
        Write-Verbose "Module ModuleBase: $($GetModule.ModuleBase)"

        $Results = Get-ChildItem $GetModule.ModuleBase -Recurse -Include $Include -File | Select-String $Text | Select-Object Path, Filename, LineNumber, Line | Out-Gridview -Title 'Results' -PassThru

        if (Get-Command 'code' -ErrorAction SilentlyContinue) {
            foreach ($Item in $Results) {
                code $($Item.Path)
            }
        }
    }
}