Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

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:

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) } }

Weźmy teraz przykładową tablicę haszującą i wywołanie funkcji konwertującej: $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'

Wygenerowany kod xml będzie wyglądał mniej więcej tak:

<Configuration> <Conventions> <ExceptionAction>125</ExceptionAction> <ServerType>sql</ServerType> <Actions> <SpecificAction>DoNothing</SpecificAction> <DefaultAction>Destroy it All</DefaultAction> </Actions> <Period>00:00:20</Period> <Option>Zip</Option> <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>  

windows porady

Komentarze

0 nowych
kwpolska   5 #1 18.07.2012 13:03

XML-e nie są ładne.