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 }