Functions/Get-ModuleHelp.ps1

function Get-ModuleHelp {
<#
    .Synopsis
        Get information on a specific module or a list of imported and installed modules
    .DESCRIPTION
        The module information includes all available resources such as Workflows, Aliases and more.
    .PARAMETER Name
        Use module name filter option to limit help information to specific module(s)
    .PARAMETER CommandName
        Retreive comnmand information from all modules or from specifc module(s)
    .PARAMETER Available
        Expand scope to include available modules (not only installed)
    .NOTES
        Author: Jack Olsson
 
    .EXAMPLE
        Get-ModuleHelp -Name PSJumpstart
 
        List all exported resources for the 'PSJumpStart' module
    .EXAMPLE
        Get-ModuleHelp -CommandName clip
 
        List all loaded modules with resources containing the name 'clip'.
#>

[CmdletBinding()]
param(
    [string]$Name,
    [string]$CommandName,
    [switch]$Available
)   
    #region local function
    function showModuleHelp($module) {
        "`n" + $module.Name
        "".PadRight(($module.Name).Length,'=')

        If ($module.ExportedWorkflows.Count -gt 0) {
            $result=$null
            $result=($module.ExportedWorkflows).Values | Where-Object {$_ -like "*$CommandName*"}

            if (![string]::IsNullOrEmpty($result)) {
                "`nWorkflows"                
                "----------"
                $result
            }
            
        }

        If ($module.ExportedDscResources.Count -gt 0) {
            $result=$null
            $result=$module.ExportedDscResources | Where-Object {$_ -like "*$CommandName*"}

            if (![string]::IsNullOrEmpty($result)) {
                "`nDsc Resources"
                "--------------"
                $result
            }
        }

        If ($module.ExportedVariables.Count -gt 0) {
            $result=$null
            $result=$module.ExportedVariables | Where-Object {$_ -like "*$CommandName*"}

            if (![string]::IsNullOrEmpty($result)) {
                "`nVariables"
                "----------"
                $result
            }
            
        }
        If ($module.ExportedTypeFiles.Count -gt 0) {
            $result=$null
            $result=$module.ExportedTypeFiles | Where-Object {$_ -like "*$CommandName*"}

            if (![string]::IsNullOrEmpty($result)) {
                "`nType Files"
                "-----------"
                $result
            }
            
        }

        If ($module.ExportedFormatFiles.Count -gt 0) {
            $result=$null
            $result=$module.ExportedFormatFiles | Where-Object {$_ -like "*$CommandName*"}

            if (![string]::IsNullOrEmpty($result)) {
                "`nFormat files"
                "-------------"
                $result
            }
            
        }
        If ($module.ExportedCommands.Count -gt 0) {
            $result=$null
            $result=($module.ExportedCommands).Values | Where-Object {$_.Name -like "*$CommandName*"} | Select-Object Name,CommandType,Version

            if (![string]::IsNullOrEmpty($result)) {
                "`nCommands"
                "--------"
                $result
            }
            
            
        }
        If ($module.ExportedAliases.Count -gt 0) {                        
            $result=$null
            $aliases = $module.ExportedAliases
            $aliases.Keys | Where-Object {$aliases[$_].Definition -like "*$CommandName*"} | ForEach-Object {
                $result+=$aliases[$_].Name + " -> " + $aliases[$_].Definition + "`n"
            }
            
            if (![string]::IsNullOrEmpty($result)) {
                "`nAliases"
                "-------"
                $result
            }
        }    
    }
    #endregion
    If ([string]::IsNullOrEmpty($Name) -and [string]::IsNullOrEmpty($CommandName)) {
        if ($Available) {
            "`nAvailable modules"
            "-----------------"
            #List installed Modules
            Get-Module -ListAvailable | Select-Object Name, Version, Description
        } else {
            "`nInstalled modules"
            "-----------------"
            #List installed Modules
            Get-InstalledModule | Select-Object Name, Version, Description
        }
        #Get current active modules
        "`nImported modules"
        "----------------"
        Get-Module | Select-Object Name, Version, ModuleType        

    } else {
        if ($Available) {
            Get-Module -ListAvailable | Where-Object {$_.Name -like "*$name*"} | ForEach-Object {
                showModuleHelp -module $_
            }
        } else {
            Get-Module | Where-Object {$_.Name -like "*$name*"} | ForEach-Object {
                showModuleHelp -module $_
            }
        }

    }
}