【问题标题】:Powershell - Multiple AD Commands, exporting into multiple columns csvPowershell - 多个 AD 命令,导出到多列 csv
【发布时间】:2020-08-25 19:08:41
【问题描述】:

我的目标是采用多个 PS 命令,将结果导出到单独的列中。数据之间没有关系。目前我运行 15-20 个单独的 PS 脚本,每个脚本将一列数据输出到自己的 csv 文件中。然后,我将这 15-20 个 csv 文档中的每一个都复制/粘贴到一个新的、单个电子表格中 - 到它们自己的列中。我试图通过运行一个脚本来提高这个过程的效率,该脚本会生成一个包含多个列的 csv 文件及其受尊重的结果。

Here is what my final output should look like:

Here is what my current output looks like

这是我当前的代码版本。尽管这是我最接近工作产品的一种,但我尝试了很多变体。

$ExportPath="\\NetworkLocation\test.csv"
$ADSG1="AD_Security_Group_Name"
$OUpath='OU=Servers,DC=sample,DC=sample,DC=org'

$TST_Script1=Get-ADGroupMember $ADSG1 | Select-object -ExpandProperty Name | Out-String
$TST_Script2=Get-ADComputer -Filter * -SearchBase $OUpath | Select-object -ExpandProperty Name | Out-String

$Object = [pscustomobject]@{
    TST_Script1 = $TST_Script1
    TST_Script2 = $TST_Script2
}
$Object | Export-Csv -Path $ExportPath -NoTypeInformation

【问题讨论】:

  • 您需要遍历最大的集合并使用生成的索引构建 PSCO。
  • 您有两个可能返回不同对象类型的脱节集合。您的两个命令都可以返回多个对象。将每个命令结果存储在一个变量中意味着每个命令都将是一个集合。 Export-Csv 通过使用属性名称作为标题并将该属性的值作为数据行将输入对象转换为文本。如果有多个具有属性值的对象,那么每个值都会得到一行。您有一个具有一个属性的对象,该属性恰好包含一组值。结果,您得到一个数据行。

标签: powershell csv


【解决方案1】:

您可以执行以下操作:

$TST_Script1=Get-ADGroupMember $ADSG1 | Select-object -ExpandProperty Name
$TST_Script2=Get-ADComputer -Filter * -SearchBase $OUpath | Select-object -ExpandProperty Name

0..(($TST_Script1.Count,$TST_Script2.Count | Sort -Desc)[0]-1) | Foreach-Object {
    [pscustomobject]@{
        TST_Script1 = $TST_Script1[$_]
        TST_Script2 = $TST_Script2[$_]
    }
} | ConvertTo-Csv -NoType

Export-Csv 将输入对象的属性转换为列标题。这些属性的值作为与标题对齐的数据行添加。在集合中管道时,集合中的每个对象都会被转换。

您尝试的问题是您正在输出一个具有两个属性的对象。然后,每个属性都包含一个值数组。这与输出多个对象不同,每个对象都有两个属性并且这些属性包含奇异值。

Out-String 通过获取数组输出并将其转换为保留格式化数组输出的单个字符串,使事情变得更加混乱。


顺便说一句,按你想要的方式做对我来说没有多大意义。 $TST_Script1$TST_Script2 似乎是脱节的,因为它们不相互依赖并且可以包含不同的对象类型。通常,您希望数据行表示共享架构或对象类型并包含描述每个对象的属性的对象。通常,来自不同对象或命令的数据用于为当前对象创建属性。但目的是更好地描述您正在输出的对象。您的目标是获取关于两个不同对象的两个不同且独立的属性,并将它们混合在一起以显示为一个对象。

【讨论】:

  • 这样做的总体目的是拥有一个包含来自 AD 的原始数据的数据集。然后,我将这些数据移动到一个跟踪电子表格中,在其中我使用 excel 函数来引用数据集。把它想象成一个引用来自另一个源/位置的数据的 excel 数据透视表。随着项目的进展,该脚本将生成新数据
  • 如果只有两个值(val1 和 val2),建议的解决方案效果很好。这似乎是对[math]::Max 的限制。如果我有 6 个或更多值怎么办?使用上面的示例,我至少需要 x6 TST_Scripts1、2、3、4、5、6。这将在 csv 文档中输出 6 列。当我更新建议的解决方案以包含 6 个变量时,我发现以下错误:Cannot find an overload for "Max" and the argument count: "6".对不起,我的 PS 技能正在增长。感谢您迄今为止的意见。
  • @Jeff 我更新了循环数学它现在可以使用两个以上的值。
  • 更新后的循环效果很好。非常感谢您在这个问题上投入的时间和精力。
猜你喜欢
  • 2020-11-18
  • 2017-01-17
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 2020-07-03
相关资源
最近更新 更多