BefehlsWerk/powershell/get-metadata.ps1
2025-04-22 20:01:18 +02:00

111 lines
2.3 KiB
PowerShell

[cmdletbinding()]
Param(
[Parameter(
Mandatory= $true
)]
[ValidateScript({Test-Path $_ -PathType Leaf})]
[string]$Path
)
begin
{
$system_types = @('Parameter','ValidatePattern','ValidateScript','ValidateSet')
}
process
{
$script_path_raw = Get-Item $Path
$script_name = $script_path_raw.Name
$script_path = $script_path_raw | Select-Object -ExpandProperty FullName
$parse_errors = @()
$AST = [System.Management.Automation.Language.Parser]::ParseFile($script_path, [ref]$null, [ref]$parse_errors)
if($null -eq $AST.ParamBlock)
{
throw "No 'Param(...)' block found: $($Path)"
}
$parameters = @()
foreach($param in $AST.ParamBlock.Parameters)
{
$param_name = $param.Name.Extent.Text
$param_type = $null
$param_mandatory = $false
$param_parameters = @()
$param_validations = @()
foreach($attr in $param.Attributes)
{
if($system_types -contains $attr.TypeName.Name)
{
switch -Wildcard ($attr.TypeName.Name)
{
"Parameter"
{
foreach($named_argument in $attr.NamedArguments)
{
if($named_argument.ArgumentName -eq 'Mandatory')
{
$param_mandatory = $named_argument.Argument.Extent.Text -eq '$true'
} else
{
$param_parameters += [pscustomobject]@{
name = $named_argument.ArgumentName
value = $named_argument.Argument.Extent.Text
}
}
}
}
"Validate*"
{
foreach($positional_argument in $attr.PositionalArguments)
{
if($positional_argument.ScriptBlock)
{
$value = $positional_argument.ScriptBlock.Extent.Text
} else
{
$value = $positional_argument.Value
}
$param_validations +=
[pscustomobject]@{
name = $attr.TypeName.Name
value = $value
}
}
}
}
} else
{
if($attr.Extent.Text -like '`[*`]')
{
if($param_type -ne $null)
{
Write-Warning "Multiple Types found for Parameter: $($attr.TypeName.Name) ($($Path))"
continue
}
$param_type = $attr.TypeName.Name
}
}
}
$parameters += [pscustomobject]@{
name = $param_name
type = $param_type
mandatory = $param_mandatory
arguments = $param_parameters
validations = $param_validations
}
}
return [pscustomobject]@{
name = $script_name
path = $script_path
parameters = $parameters
}
}