functions/parsing/Read-JeaScriptblock.ps1
function Read-JeaScriptblock { <# .SYNOPSIS Reads a scriptblock and returns qualified command objects of commands found. .DESCRIPTION Reads a scriptblock and returns qualified command objects of commands found. .PARAMETER ScriptCode The string version of the scriptcode to parse. .PARAMETER ScriptBlock A scriptblock to parse. .PARAMETER EnableException This parameters disables user-friendly warnings and enables the throwing of exceptions. This is less user friendly, but allows catching exceptions in calling scripts. .EXAMPLE PS C:\> Get-SBLEvent | Read-JeaScriptblock Scans the local computer for scriptblock logging events and parses out the commands they use. #> [CmdletBinding()] param ( [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [Alias('Code')] [string[]] $ScriptCode, [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [System.Management.Automation.ScriptBlock[]] $ScriptBlock, [switch] $EnableException ) begin { Write-PSFMessage -Level InternalComment -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" -Tag 'debug', 'start', 'param' $fromPipeline = Test-PSFParameterBinding -ParameterName ScriptCode, ScriptBlock -Not } process { #region Processing Scriptblock strings foreach ($codeItem in $ScriptCode) { if ($codeItem -eq 'System.Management.Automation.ScriptBlock') { continue } if ($ScriptBlock -and $fromPipeline) { continue } # Never log the full scriptblock, it might contain sensitive information Write-PSFMessage -Level Verbose -Message "Processing a scriptblock with $($codeItem.Length) characters" try { $codeBlock = [System.Management.Automation.ScriptBlock]::Create($codeItem) } catch { Stop-PSFFunction -Message "Failed to parse text as scriptblock, skipping" -EnableException $EnableException -ErrorRecord $_ -OverrideExceptionMessage -Continue } $commands = (Read-Script -ScriptCode $codeBlock).Tokens | Where-Object TokenFlags -like "*CommandName*" | Group-Object Text | Select-Object -ExpandProperty Name | Where-Object { $_ } Write-PSFMessage -Level Verbose -Message "$($commands.Count) different commands found" -Target $pathItem if ($commands) { Get-CommandMetaData -CommandName $commands } } #endregion Processing Scriptblock strings #region Processing Scriptblocks foreach ($codeItem in $ScriptBlock) { # Never log the full scriptblock, it might contain sensitive information Write-PSFMessage -Level Verbose -Message "Processing a scriptblock with $($codeItem.ToString().Length) characters" $commands = (Read-Script -ScriptCode $codeItem).Tokens | Where-Object TokenFlags -like "*CommandName*" | Group-Object Text | Select-Object -ExpandProperty Name | Where-Object { $_ } Write-PSFMessage -Level Verbose -Message "$($commands.Count) different commands found" -Target $pathItem if ($commands) { Get-CommandMetaData -CommandName $commands } } #endregion Processing Scriptblocks } } |