首页 > 解决方案 > 将数组中的每个元素发送到单独的 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>

标签: powershell

解决方案


从昨天开始,我也一直在尝试解决这个问题。到目前为止,我快速而肮脏的解决方案是使用Add-Contentcmdlet 将数据直接添加到 Csv 文件中。这会将数组中的所有信息添加到一个单元块中。

您的代码如下所示: Add-Content -Path c:\temp\gpo.csv -Value "$name, $var2, $var3"

注意:逗号用作 Csvs 的列分隔符。


推荐阅读