core/modules/monkeyjob/private/Get-CommandInfo.ps1

# Monkey365 - the PowerShell Cloud Security Tool for Azure and Microsoft 365 (copyright 2022) by Juan Garrido
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Function Get-CommandInfo{
    <#
        .SYNOPSIS
        Get command information from ScriptBlock
 
        .DESCRIPTION
        Get command information from ScriptBlock
 
        .INPUTS
 
        .OUTPUTS
 
        .EXAMPLE
 
        .NOTES
            Author : Juan Garrido
            Twitter : @tr1ana
            File Name : Get-CommandInfo
            Version : 1.0
 
        .LINK
            https://github.com/silverhack/monkey365
    #>


    [CmdletBinding(DefaultParameterSetName="Default")]
    [OutputType([System.String], ParameterSetName='CommandName')]
    [OutputType([System.Management.Automation.CommandInfo], ParameterSetName='Default')]
    Param (
        [Parameter(Mandatory=$True,ValueFromPipeline=$true, HelpMessage = 'ScriptBlock')]
        [System.Management.Automation.ScriptBlock]$ScriptBlock,

        [Parameter(Mandatory=$false, HelpMessage = 'Get all commands')]
        [Switch]$All,

        [Parameter(Mandatory=$false, ParameterSetName='CommandName', HelpMessage = 'Get only command name')]
        [Switch]$Name
    )
    Begin{
        $query = '$Ast -is [System.Management.Automation.Language.CommandAst]'
    }
    Process{
        Try{
            #Set parameters
            $p = @{
                ScriptBlock = $ScriptBlock;
                Query = $query;
                AddParam = $True;
            }
            If($PSBoundParameters.ContainsKey('All') -and $PSBoundParameters['All'].IsPresent){
                [void]$p.Add('FindAll',$True)
            }
            #Get potential commands
            $commandElements = Find-ElementFromAst @p | Select-Object -ExpandProperty CommandElements -ErrorAction Ignore
            $allCommands = @($commandElements).Where({$null -ne $_ -and $_ -is [System.Management.Automation.Language.StringConstantExpressionAst] -and $_.StringConstantType -eq [System.Management.Automation.Language.StringConstantType]::BareWord})
            #Return only command name
            If($PSCmdlet.ParameterSetName.ToLower() -eq "commandname"){
                $allCommands | Select-Object -ExpandProperty value -ErrorAction Ignore
            }
            Else{#Return command Info
                $allCommands.ForEach({Get-Command -Name $_.value -ErrorAction Ignore})
            }
        }
        Catch{
            Write-Error $_
            return $null
        }
    }
}