以下脚本
$d = New-Object -TypeName 'System.Collections.Generic.Dictionary[int, bool]'
$d.Add(1, $true)
$d.Add(2, $false)
($d | ConvertTo-Xml).DocumentElement.OuterXml
退货
<Objects>
<Object Type="System.Collections.Generic.Dictionary`2[System.Int32,System.Boolean]">
<Property Name="Key" Type="System.Int32">1</Property>
<Property Name="Value" Type="System.Boolean">True</Property>
<Property Name="Key" Type="System.Int32">2</Property>
<Property Name="Value" Type="System.Boolean">False</Property>
</Object>
</Objects>
但是,它能返回以下内容吗?
<Objects>
<Object Key="1" Value="True" />
<Object Key="2" Value="False" />
</Objects>
ConvertTo-Xml
(宽松地说,内存中与Export-CliXml
相对应,尽管具有不同的输出格式),所需格式的最接近的近似需要添加-NoTypeInformation
开关,这给你相当于:
<Objects>
<Object>
<Property Name="Key">1</Property>
<Property Name="Value">True</Property>
<Property Name="Key">2</Property>
<Property Name="Value">False</Property>
</Object>
</Objects>
注:
ConvertTo-Xml
实际上是无用的,因为生成的 XML 格式既没有记录,也没有补充的 cmdlet 来解释(反序列化)它。ConvertTo-CliXml
和 ConvertFrom-CliXml
cmdlet,它们使用基于标准化 XML 的格式 CLIXML ,PowerShell 使用该格式进行跨进程序列化,例如在远程处理中。要获得所需的输出,您必须手动创建 XML :
$d.GetEnumerator() | ForEach-Object { '<Objects>' } {
' <Object Key="{0}" Value="{1}" />' -f $_.Key, $_.Value
} { '</Objects>'}
注意需要使用
.GetEnumerator()
才能通过管道单独发送键值对;默认情况下,PowerShell 不会枚举管道中的哈希表/字典条目。