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:

reklama


$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