【问题标题】:PowerShell, How to combine two sets of unrelated data into one array or csvPowerShell,如何将两组不相关的数据组合成一个数组或csv
【发布时间】:2022-01-20 14:45:34
【问题描述】:

我正在尝试编写一个简单的 powershell 脚本来从机器上提取软件和服务数据。所以我试图找出将数据合并到一个 cvs 文件而不是两个单独的 csv 文件的最佳方法。我想使用下面的,但最终合并两组数据会节省时间。

Get-Services | Select StartType, Status, Name, DisplayName |
Export-CSV -path $servicescsv

Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | 
Export-CSV -path $softwarecsv

所以上面可能很简单,但我可以为软件和服务创建两个数组。但是,在不相互覆盖的情况下组合两个数组的最佳方法是什么?我知道其中一个问题是软件的 DisplayName 与服务的 DisplayName 冲突。所以现在$array3 = $services + $software 只是将软件显示名称添加到数组中,而其他列都丢失了。

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 您希望如何构建生成的 CSV?请注意,您的两个数据集之间没有联系... [皱眉]
  • 可能是包含软件数据集的新列。老实说,我不太确定该往哪个方向发展。
  • 如果我是你,我会坚持使用两个 csv 文件,因为数据完全不相关。为什么合并它们对您很重要?
  • 只是为了尽量减少文件的数量,但所有数据都只是被添加到数据透视表中表示的数据集中。数据透视表将显示网络中所有计算机的软件和服务报告。
  • 您可以使用这个Join-Object script/Join-Object Module(另请参阅:In Powershell, what's the best way to join two tables into one?),它也可以进行并行连接:Import-Csv $servicescsv | FullJoin (Import-Csv $softwarecsv) -Name Service,Software

标签: powershell audit sysadmin


【解决方案1】:

如果没有示例,当前的 CSV 文件和您想要的输出,不清楚您的预期目标是什么。

我认为你可以像这样完成你想做的事情:

Get-Service |
    Select-Object StartType, Status, Name, DisplayName, DisplayVersion, Publisher, InstallDate |
    Export-CSV -Path $CombinedCsv

Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
    Select-Object StartType, Status, Name, DisplayName, DisplayVersion, Publisher, InstallDate |
    Export-CSV -Path $CombinedCSV -Append

问题在于 Export-Csv 使用管道中的第一个对象来识别可用属性。如果您需要包含一开始不存在的属性,则应指定所有这些属性。这将导致 Select-Object 创建空白的新属性,然后将其正确导出为 CSV。

另一方面,如果您的目标是尝试连接 $servicescsv$softwarecsv,就像两个具有公共字段的 SQL 表一样...好吧,您可以这样做,但它要复杂得多,并且需要关键字段加入。我认为您列出的注册表项的 DisplayName 属性和服务模块很可能不会就名称达成一致。尤其是因为注册表中的许多条目没有 DisplayName。

【讨论】:

  • 好的,这可以帮助我为数据生成一个 .csv 文件。谢谢你。有没有办法将软件的项目属性 DisplayName 临时重命名为 DisplayNameSoftware,使其位于新列中?也许为软件数据建立一个数组,然后重命名第一行标题名称,以便可以组合两个数组?理想情况下,我希望 CVS 文件具有这种格式。开始类型、状态、名称、显示名称、显示名称软件、显示版本、发布者、安装日期
  • @Elminster 听起来你想要的是calculated property。但我仍然不太清楚你在寻找什么。这对我来说毫无意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多