Get-ModuleConflict.ps1

<#
.SYNOPSIS
    Checks the exported commands in a set of modules looking for commands
    that have naming conflicts.
 
.DESCRIPTION
    When two modules export commands with the same name, there can be
    unpredictable results when the unqualified name of the module is
    used in scripts.
     
    This command allows you to specify a set of modules to check for
    commands that have the same name and reports the results. To
    check against the set of modules currently loaded in the session,
    you can pipe the output of Get-Module to it.
     
.EXAMPLE
    Get-Module | Get-ModuleConflict
.EXAMPLE
    Get-ModuleConflict * -Exclude Azure*,MSOnline*
.EXAMPLE
    Get-ModuleConflict Microsoft.*,Einstein
 
.INPUTS
    System.Management.Automation.PSModuleInfo[]
.OUTPUTS
    System.Management.Automation.CommandInfo[]
#>

function Get-ModuleConflict {
    
    [CmdletBinding(DefaultParameterSetName='ModuleInfo')]
    [OutputType([System.Management.Automation.CommandInfo[]])]
    param (
        
        # The name of one or more modules to check for conflicts.
        # The modules will not be loaded, but the ExportedCommands of the
        # module's manifest will be used to look for command names.
        # You may specify multiple modules names and wildcards are allowed.
        # To check all modules installed on the system, use *.
        [ValidateNotNullOrEmpty()]
        [Parameter(ParameterSetName='ModuleName', Mandatory=$true, Position=1)]
        [String[]]$ModuleName,
        
        # Specifies one or more module infos to check for conflicts.
        # The most common use case here is to pipe input from Get-Module.
        [ValidateNotNullOrEmpty()]
        [Parameter(ParameterSetName='ModuleInfo', Mandatory=$true, ValueFromPipeline=$true)]
        [System.Management.Automation.PSModuleInfo[]]$ModuleInfo,
        
        # Optionally can be used to refine the set of modules to check by
        # name. Wildcards are allowed.
        [Parameter()]
        [String[]]$Include,
        
        # Optionally can be used to refine the set of modules to check by
        # name. Wildcards are allowed.
        [Parameter()]
        [String[]]$Exclude

    )

    begin {
        
        $Commands = @()
        
        # When specifying modules by name, get them up front by
        # calling Get-Module and selecting the exported commands.
        if ($ModuleName.Length) {
            $Commands += @(Get-Module -Name:$ModuleName -ListAvailable | ForEach-Object { $_.ExportedCommands.Values })
        }
    }
    
    process {
        
        # When specifying modules by piping to ModuleInfo, collect
        # the exported commands into the array.
        if ($ModuleInfo.Length) {
            $Commands += @($ModuleInfo.ExportedCommands.Values)
        }
        
    }
    
    end {
        
        $Commands |
        # Process -Include filter
        ForEach-Object {
            if (!$Include.Length) {
                Write-Output $_
            }
            else {
                foreach ($Pattern in $Include) {
                    if ($_.Source -like $Pattern) {
                        Write-Output $_
                        Return
                    }
                }
            }
        } | 
        # Process -Exclude filter
        ForEach-Object {
            if (!$Exclude.Length) {
                Write-Output $_
            }
            else {
                foreach ($Pattern in $Exclude) {
                    if ($_.Source -like $Pattern) {
                        Return
                    }
                }
                Write-Output $_
            }
        } | 
        Group-Object Name | 
        Where-Object Count -gt 1 | 
        Select-Object -ExpandProperty Group
        
    }    
    
}
    
<#PSScriptInfo
 
.VERSION 1.0
.DESCRIPTION Checks a set of modules for conflicting command names.
.GUID 2a86f4a2-76b4-4869-b148-cdfb91d46776
.AUTHOR Josh Einstein
.COMPANYNAME
.COPYRIGHT
.TAGS
.LICENSEURI
.PROJECTURI
.ICONURI
.EXTERNALMODULEDEPENDENCIES
.REQUIREDSCRIPTS
.EXTERNALSCRIPTDEPENDENCIES
.RELEASENOTES
 
#>