Generowanie ładnych xmli z HashTable w Powershell
Używał ktoś kiedyś gdzieś ConvertTo-XML lub Export-CLIXml w Powershellu na HashTable? A próbował to potem odczytać? jakieś miętolenie a nie xml ! A jak jeszcze dodamy zagnieżdżone HashTable to już odlot. No więc dla własnej wygody obmyśliłem żeby konwertować HashTable do XML w formacie, który będzie w miarę czytelny dla przeciętnego klikacza myszką. Obsługiwane mają być HashTable jako wartości:
[code=Powershell] Function Out‑HashTableToXml { [cmdletbinding()] Param( [ValidateNotNullOrEmpty()] [System.String]$Root, [Parameter(ValueFromPipeline = $true, Position = 0)] [System.Collections.Hashtable]$InputObject, [ValidateScript({Test-Path $_ -IsValid})] [System.String]$Path ) Begin{ $ScriptBlock = { Param($Elem, $Root) if( $Elem.Value -is [System.Collections.Hashtable] ){ $RootNode = $Root.AppendChild($Doc.CreateNode([System.Xml.XmlNodeType]::Element,$Elem.Key,$Null)) $Elem.Value.GetEnumerator() | ForEach-Object { $Scriptblock.Invoke( @($_, $RootNode) ) } } else{ $Element = $Doc.CreateElement($Elem.Key) $Element.InnerText = $Elem.Value.ToString() $Root.AppendChild($Element) | Out‑Null } } } Process{ $Doc = [xml]"<$($Root)></$($Root)>" $InputObject.GetEnumerator() | ForEach-Object { $scriptblock.Invoke( @($_, $doc.DocumentElement) ) } $doc.Save($Path) } }[/code]
Weźmy teraz przykładową tablicę haszującą i wywołanie funkcji konwertującej:
[code=Powershell] $Configuration = @{ 'Definitions' = @{ 'ConnectionString' = 'sql=srv01;port=223' 'MonitoringLevel' = 'MonitoringLevelValue' } 'Conventions' = @{ 'MyConvention' = 'This is my convention' 'Option' = 'Zip' 'ServerType' = 'sql' 'Actions' = @{ 'SpecificAction' = 'DoNothing' 'DefaultAction' = 'Destroy it All' } 'ExceptionAction' = 125 'Period' = New‑TimeSpan -Seconds 20 } 'ServiceAccount' = @{ 'UserName' = 'mydomain.com\thisisme' 'Password' = '123o123' } 'GroupConfiguration' = @{ 'AdminsGroup' = 'mydomain.com\thisisAdminsGroup' 'UsersGroup' = 'mydomain.com\thisisUsersGroup' } }
$Configuration | Out‑HashTableToXml -Root 'Configuration' -Path 'D:\confgiuration.xml' [/code]
Wygenerowany kod xml będzie wyglądał mniej więcej tak:
[code=XML] <Configuration> <Conventions> <ExceptionAction>125</ExceptionAction> <ServerType>sql</ServerType> <Actions> <SpecificAction>DoNothing</SpecificAction> <DefaultAction>Destroy it All</DefaultAction> </Actions> <Period>00:00:20</Period> <MyConvention>This is my convention</MyConvention> </Conventions> <GroupConfiguration> <UsersGroup>mydomain.com\thisisUsersGroup</UsersGroup> <AdminsGroup>mydomain.com\thisisAdminsGroup</AdminsGroup> </GroupConfiguration> <Definitions> <MonitoringLevel>MonitoringLevelValue</MonitoringLevel> <ConnectionString>sql=srv01;port=223</ConnectionString> </Definitions> <ServiceAccount> <Password>123o123</Password> <UserName>mydomain.com\thisisme</UserName> </ServiceAccount> </Configuration> [/code]