【问题标题】:Sending each element from an array into a separate CSV row将数组中的每个元素发送到单独的 CSV 行
【发布时间】:2018-10-19 19:03:44
【问题描述】:

我正在尝试编写一个脚本,将数组的每个元素放入 .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>

【问题讨论】:

  • J. Scott - 您的 csv 文件在这些位置包含对象数组。 [grin] 您需要扩展数组并将其转换为字符串或为集合中的每个项目创建一个新属性。第一个是通常的修复。 $Collection -join '; ' 之类的东西是解决问题的一种常用方法。
  • 那么您是否希望每个组名的每个成员都有一行?在上述情况下,名称列是否会为 1 和 3 重复?
  • 好的,谢谢 Lee_Dailey。我使用 -join 找不到参数。在这种情况下,我会将其放在变量 $GroupName 和 $MemberOf 之后正确吗?
  • Matt 是的,这是我能想到的唯一方法,尽管在实践中我不确定它是如何工作的。我想我可能会得到一个普通的“名称”列,然后数组的输出会超出这个范围。
  • 我以为我有答案,但事实是,Excel 不能做多层电子表格。它们是平的。这就是 json 和 xml 存在的原因。但这取决于您要扩展的内容,如果它只是字符串列表,并且您想扩展属于它的所有者的所有内容,我的意思是我不怀疑有办法,但我会查看 json/xml 以获得我的答案在这个难度级别...

标签: powershell


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多