Initial commit
This commit is contained in:
152
Functions/Export-Hashtable.ps1
Normal file
152
Functions/Export-Hashtable.ps1
Normal file
@@ -0,0 +1,152 @@
|
||||
function Export-Hashtable {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Exportiert einen PowerShell Hashtable als valide PSD1-Datei.
|
||||
|
||||
.DESCRIPTION
|
||||
Diese Funktion konvertiert einen PowerShell Hashtable in eine gültige PSD1-Datei
|
||||
mit korrekter Formatierung und Einrückung.
|
||||
|
||||
.PARAMETER Hashtable
|
||||
Der zu exportierende Hashtable
|
||||
|
||||
.PARAMETER Path
|
||||
Der Pfad zur Ziel-PSD1-Datei
|
||||
|
||||
.PARAMETER Indent
|
||||
Die Anzahl der Leerzeichen für die Einrückung (Standard: 4)
|
||||
|
||||
.EXAMPLE
|
||||
$data = @{
|
||||
ModuleName = "MeinModul"
|
||||
Version = "1.0.0"
|
||||
Author = "Max Mustermann"
|
||||
Settings = @{
|
||||
Debug = $true
|
||||
MaxRetries = 3
|
||||
}
|
||||
}
|
||||
Export-Hashtable -Hashtable $data -Path "C:\config.psd1"
|
||||
#>
|
||||
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.Collections.Hashtable]$Hashtable,
|
||||
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.String]$Path,
|
||||
|
||||
[Parameter(Mandatory = $false)]
|
||||
[Int]$Indent = 4
|
||||
)
|
||||
|
||||
function ConvertTo-Psd1String {
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
$Object,
|
||||
|
||||
[Parameter(Mandatory = $false)]
|
||||
[int]$Level = 0
|
||||
)
|
||||
|
||||
$indentStr = " " * ($Indent * $Level)
|
||||
$nextIndentStr = " " * ($Indent * ($Level + 1))
|
||||
|
||||
if ($null -eq $Object) {
|
||||
return "`$null"
|
||||
}
|
||||
|
||||
switch ($Object.GetType().Name) {
|
||||
"Hashtable" {
|
||||
if ($Object.Count -eq 0) {
|
||||
return "@{}"
|
||||
}
|
||||
|
||||
$lines = @("@{")
|
||||
foreach ($key in ($Object.Keys)) {
|
||||
$value = ConvertTo-Psd1String -Object $Object[$key] -Level ($Level + 1)
|
||||
$lines += "$nextIndentStr$key = $value"
|
||||
}
|
||||
$lines += "$indentStr}"
|
||||
return ($lines -join "`r`n")
|
||||
}
|
||||
|
||||
"Object[]" {
|
||||
if ($Object.Count -eq 0) {
|
||||
return "@()"
|
||||
}
|
||||
|
||||
$lines = @("@(")
|
||||
foreach ($item in $Object) {
|
||||
$value = ConvertTo-Psd1String -Object $item -Level ($Level + 1)
|
||||
$lines += "$nextIndentStr$value"
|
||||
}
|
||||
$lines += "$indentStr)"
|
||||
return ($lines -join "`r`n")
|
||||
}
|
||||
|
||||
"ArrayList" {
|
||||
return ConvertTo-Psd1String -Object $Object.ToArray() -Level $Level
|
||||
}
|
||||
|
||||
"String" {
|
||||
# Escape für einfache Anführungszeichen
|
||||
$escaped = $Object -replace "'", "''"
|
||||
return "'$escaped'"
|
||||
}
|
||||
|
||||
"Boolean" {
|
||||
return "`$$Object"
|
||||
}
|
||||
|
||||
"Int32" {
|
||||
return $Object.ToString()
|
||||
}
|
||||
|
||||
"Int64" {
|
||||
return $Object.ToString()
|
||||
}
|
||||
|
||||
"Double" {
|
||||
return $Object.ToString()
|
||||
}
|
||||
|
||||
default {
|
||||
if ($Object -is [Array]) {
|
||||
return ConvertTo-Psd1String -Object @($Object) -Level $Level
|
||||
}
|
||||
# Fallback für andere Typen
|
||||
return "'$Object'"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
$psd1Content = ConvertTo-Psd1String -Object $Hashtable
|
||||
|
||||
# Stelle sicher, dass das Verzeichnis existiert
|
||||
$directory = Split-Path -Path $Path -Parent
|
||||
if ($directory -and -not (Test-Path -Path $directory)) {
|
||||
New-Item -Path $directory -ItemType Directory -Force | Out-Null
|
||||
}
|
||||
|
||||
# Schreibe die Datei mit UTF8-BOM Encoding (Standard für PSD1)
|
||||
$psd1Content | Out-File -FilePath $Path -Encoding utf8 -Force
|
||||
|
||||
Write-Verbose "Hashtable erfolgreich nach '$Path' exportiert"
|
||||
|
||||
# Validiere die erstellte PSD1-Datei
|
||||
try {
|
||||
$null = Import-PowerShellDataFile -Path $Path
|
||||
Write-Verbose "PSD1-Datei erfolgreich validiert"
|
||||
}
|
||||
catch {
|
||||
Write-Warning "Die erstellte PSD1-Datei konnte nicht validiert werden: $_"
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Error "Fehler beim Exportieren des Hashtables: $_"
|
||||
throw
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user