Initial commit
This commit is contained in:
89
Functions/Import-OrderedPowerShellDataFile.ps1
Normal file
89
Functions/Import-OrderedPowerShellDataFile.ps1
Normal file
@@ -0,0 +1,89 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user