更新:请参见底部的工作示例。
我尝试使用对象作为输入来创建XML文件:
Get-ActiveDirectoryForest -Domain $Domain | GenerateXml
如何将对象传递给其他函数并使用此对象创建XML文件?通过throug传递的对象始终具有相同的第一个属性(TableName),其余属性不同。
我的对象看起来像:
TableName Domain User Status UNC
Network-Domain-Locked users test.local John Doe Locked John.Doe@test.local
Network-Domain-Locked users test.local Jane Doe Locked Jane.Doe@test.local
我创造的功能:
Function GenerateXml {
[CmdLetBinding()]
Param (
[parameter(Mandatory=$True, ValueFromPipelineByPropertyName=$True)]
[Object]$Object,
[parameter(Mandatory=$True, ValueFromPipelineByPropertyName=$True)]
[String]$TableName
)
Begin {
$XmlExportPath = $Script:Settings.XmlFolder
If ((Test-Path -Path $XmlExportPath\export.xml)) {
Remove-Item -Path $XmlExportPath\export.xml -Force
}
Add-Content -Path $XmlExportPath\export.xml -Value @'
<?xml version="1.0" encoding="utf-8"?>
<ImportFile>
<Module Name="Network-Collection">
<Task>Test export object</Task>
</Module>
<Input TableName="$TableName">
'@
}
Process {
Try {
$TableName = $Object.TableName #Can't find the property on the object..
Write-Host "Database tabel: $TableName"
$(foreach ($Item in $Object) {
Add-Content -Path $XmlExportPath\export.xml -Value '@`t`t<$($Item.Key)>$($Item.Value)</$($Item.Key)>@'
})
}
Catch { Write-Error $_ }
}
End {
Add-Content -Path $XmlExportPath\export.xml -Value @'
</Input>
</BitImportFile>
'@
} # End Region
}
@Update:
- 我已经删除了Mandatory = $ True,发现对象可以通过`$ _来访问。
- 关于xml的问题仍然存在
@Update 2:工作示例
Function GenerateXml {
[CmdLetBinding()]
Param (
[parameter(ValueFromPipelineByPropertyName=$True)]
[Object]$Object,
[parameter(ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
[String]$TableName
)
Begin {
$XmlExportFile = "C:\Temp\Export.xml"
[xml]$Xml = @'
<?xml version="1.0" encoding="utf-8"?>
<ImportFile>
<Module Name="" Date="" />
<Input TableName="">
</Input>
</ImportFile>
'@
}
Process {
Try {
$XmlNode = $Xml.ImportFile
$XmlNode.Module.Name = $_.TaskName
$XmlNode.Input.TableName = $_.TableName
$XmlProperties = $_.PSObject.Properties
Foreach ($XmlProp in ($XmlProperties | Where-Object {$_.Name -ne "TaskName" -and $_.Name -ne "TableName"})) {
$Name = $XmlProp.Name
$Value = $XmlProp.Value
$newRole = $xml.CreateElement($Name)
$Xml.ImportFile.Input.AppendChild($newRole) | Out-Null
$newRole.SetAttribute("Value",$Value);
}
}
Catch { Write-Error $_ }
}
End {
$Xml.Save("$XmlExportFile")
}
}
答案 0 :(得分:1)
假设CovertTo-XML输出不符合您的喜好,并且您想手动构建XML文件,那么就可以这样做。
为XML文档奠定基础并将其存储在变量中:
[xml]$xml = @'
<?xml version="1.0" encoding="utf-8"?>
<ImportFile>
<Module Name="Network-Collection">
<Task>Test export object</Task>
</Module>
<Input TableName="$TableName">
</Input>
</ImportFile>
'@
现在您拥有了文件的shell,您可以随意添加新节点。您可能会执行foreach对象并根据该记录的需要创建XML元素和属性。然后将其附加回已存在的父节点。
$newNode = $xml.CreateElement('Test') # Here we make a XML element that is compatible with with $xml document as a whole.
$xml.ImportFile.Input.appendNode($newNode) # and here we attach that Test node to the existing Input node.
如果你想添加一个属性,你可以在添加它之前将其添加到$ newNode,如下所示:
$newNode.SetAttribute('name','myDomain')