powershell - 将数组中的每个元素发送到单独的 CSV 行
问题描述
我正在尝试编写一个脚本,将数组的每个元素放入 .CSV 中它自己的单独行中。到目前为止,这是脚本的样子:
$table = @()
(gci *.xml -Recurse -force | select-string -pattern "RestrictedGroups" -List | select-xml -xpath *) | sort | foreach {
$gpo = $_.Path
[xml]$xml = gc $gpo
$Name = $xml.GPO.Name
$GroupName = @($xml.GPO.Computer.ExtensionData.Extension.RestrictedGroups.GroupName.Name."#text")
$MemberOf = @($xml.GPO.Computer.ExtensionData.Extension.RestrictedGroups.MemberOf.Name."#text")
$Record = New-Object PSObject
$Record | Add-Member -MemberType NoteProperty -Name "Name" -Value $Name
$Record | Add-Member -MemberType NoteProperty -Name "GroupName" -Value $var2
$Record | Add-Member -MemberType NoteProperty -Name "MemberOf" -Value $var3
$table += $Record
}
$table | Export-CSV c:\temp\gpo.csv -NoTypeInformation -Delimiter ","
“名称”的计数始终为 1,其他的计数通常更高。样本输出:
Name GroupName MemberOf
1 aaa System.Object[]
2 bbb ccc
3 System.Object[] System.Object[]
如您所见,CSV 中的许多值都输出为“System.Object[]”,而不是我尝试提取的值。在某些情况下,它们显示为我正在寻找的实际名称(aaa,bbb),我怀疑这是数组中只有一个元素的情况。
使用 set-content 而不是 export-csv 几乎可以工作,除非我这样做,数组的每个元素都被放入一个单元格中。我可以添加一个逗号分隔符,但这只是将新元素添加到下一个列单元格中,而不是下一个行单元格中。
关于如何获取它的任何想法,以便将 member 和 LocalGroup 数组的每个元素放入其各自标题下的自己的单元格中?
这是一个将运行的示例 XML 文件:
<?xml version="1.0" encoding="utf-16"?>
<GPO xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.microsoft.com/GroupPolicy/Settings">
<Computer>
<ExtensionData>
<Extension xmlns:q1="xxx" xsi:type="q1:SecuritySettings">
<q1:RestrictedGroups>
<q1:GroupName>
<SID xmlns="http://www.microsoft.com/GroupPolicy/Types">SID</SID>
<Name xmlns="http://www.microsoft.com/GroupPolicy/Types">MemberName</Name>
</q1:GroupName>
<q1:Memberof>
<SID xmlns="http://www.microsoft.com/GroupPolicy/Types">SID2</SID>
<Name xmlns="http://www.microsoft.com/GroupPolicy/Types">MemberOf</Name>
</q1:Memberof>
</q1:RestrictedGroups>
</Extension>
</ExtensionData>
</Computer>
解决方案
从昨天开始,我也一直在尝试解决这个问题。到目前为止,我快速而肮脏的解决方案是使用Add-Content
cmdlet 将数据直接添加到 Csv 文件中。这会将数组中的所有信息添加到一个单元块中。
您的代码如下所示:
Add-Content -Path c:\temp\gpo.csv -Value "$name, $var2, $var3"
注意:逗号用作 Csvs 的列分隔符。
推荐阅读
- json - 返回一个 JSON 对象
- regex - Scala中字符串拆分正则表达式中的正斜杠
- java - 如何从 Spinner 获得吐司
- reactjs - 在 onChange 函数中将一页链接到另一页
- jquery - React 仅在键入时保存输入值状态,但在由 API 数据填充时不保存
- keyboard - 如何更改键盘快捷键以在 Chrome OS 上切换输入语言?
- google-chrome-devtools - 将 sourceURL 和 sourceMappingURL 与相对路径一起使用
- html - 将鼠标悬停在上面的图像上时,如何更改滑块的不透明度?
- xml - 如何修复节点上附加的空白换行符,在更改 XML 节点上的数据时我没有触及?
- xml - USQL - 如何使用 xml 提取器从 xml 文件中提取属性值