89 lines
2.9 KiB
PowerShell
89 lines
2.9 KiB
PowerShell
function Import-OrderedPowerShellDataFile {
|
|
param(
|
|
[Parameter(Mandatory)]
|
|
[string]$Path
|
|
)
|
|
|
|
function ConvertTo-OrderedHashtable {
|
|
param(
|
|
$HashtableAst
|
|
)
|
|
|
|
# Verwende OrderedDictionary statt [ordered]@{}
|
|
$ordered = New-Object System.Collections.Specialized.OrderedDictionary
|
|
|
|
# Sortiere KeyValuePairs nach ihrer Position im Quelltext
|
|
$sortedKvps = $HashtableAst.KeyValuePairs | Sort-Object { $_.Item1.Extent.StartOffset }
|
|
|
|
foreach ($kvp in $sortedKvps) {
|
|
# Schlüssel extrahieren
|
|
$key = $kvp.Item1.Extent.Text -replace '[''"]', ''
|
|
|
|
# Wert verarbeiten
|
|
$valueAst = $kvp.Item2
|
|
|
|
# Suche nach HashtableAst in PipelineAst
|
|
$hashtable = $null
|
|
if ($valueAst -is [System.Management.Automation.Language.HashtableAst]) {
|
|
$hashtable = $valueAst
|
|
}
|
|
elseif ($valueAst -is [System.Management.Automation.Language.PipelineAst]) {
|
|
# Suche HashtableAst innerhalb der Pipeline
|
|
$hashtable = $valueAst.Find({
|
|
$args[0] -is [System.Management.Automation.Language.HashtableAst]
|
|
}, $false)
|
|
}
|
|
|
|
if ($hashtable) {
|
|
$value = ConvertTo-OrderedHashtable -HashtableAst $hashtable
|
|
}
|
|
elseif ($valueAst -is [System.Management.Automation.Language.ArrayLiteralAst]) {
|
|
$value = @()
|
|
foreach ($element in $valueAst.Elements) {
|
|
if ($element -is [System.Management.Automation.Language.HashtableAst]) {
|
|
$value += ConvertTo-OrderedHashtable -HashtableAst $element
|
|
}
|
|
else {
|
|
$value += Invoke-Expression $element.Extent.Text
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
try {
|
|
$value = Invoke-Expression $valueAst.Extent.Text
|
|
}
|
|
catch {
|
|
$value = $valueAst.Extent.Text
|
|
}
|
|
}
|
|
|
|
$ordered.Add($key, $value)
|
|
}
|
|
|
|
return $ordered
|
|
}
|
|
|
|
# Datei parsen
|
|
$errors = $null
|
|
$tokens = $null
|
|
$ast = [System.Management.Automation.Language.Parser]::ParseFile(
|
|
$Path,
|
|
[ref]$tokens,
|
|
[ref]$errors
|
|
)
|
|
|
|
if ($errors) {
|
|
throw "Fehler beim Parsen der Datei: $($errors[0].Message)"
|
|
}
|
|
|
|
# Finde die oberste Hashtable
|
|
$hashtableAst = $ast.Find({
|
|
$args[0] -is [System.Management.Automation.Language.HashtableAst]
|
|
}, $true)
|
|
|
|
if (-not $hashtableAst) {
|
|
throw "Keine Hashtable in der Datei gefunden"
|
|
}
|
|
|
|
return ConvertTo-OrderedHashtable -HashtableAst $hashtableAst
|
|
} |