在 Powershell 中过滤 CSV

在 Powershell 中过滤 CSV

我目前正在编制一份计算机上安装的软件列表。我的最终目标是过滤掉所有基线软件,以便获得准确的安装报告。我不得不搜索注册表的一个区域,该区域捕获了安装过程中输入的大量额外信息。最初,我创建了一个“baseline.csv”来清除捕获的内容,但由于不断更新,这个文件变得太大且难以管理。所以我认为创建一个“abovebaseline.csv”文件来清除基线并保留与 abovebasline 中列出的软件相匹配的项目会更简单、更快捷。

捕获软件列表后,我现在运行它来清除基线。

$BaselineSoftware = Import-Csv $PSScriptRoot\baseline.csv

$InstalledSoftware = Import-Csv $PSScriptRoot\ALLsoftware.csv


Foreach($software in $BaselineSoftware)

   {

   $InstalledSoftware = $InstalledSoftware | where {$($_.ProductName) -ne $($software.ProductName) }

   }

$InstalledSoftware | Export-Csv -Path $PSScriptRoot\software.csv -NoTypeInformation

我认为这很简单,只需将 -ne 改为 -eq,并将基线文件的内容和名称改为 abovebaseline。但是当我运行它时,software.csv 文件是空的。

$AboveBaselineSoftware = Import-Csv $PSScriptRoot\AboveBaselineSoftware.csv

$InstalledSoftware = Import-Csv $PSScriptRoot\ALLsoftware.csv


Foreach($software in $AboveBaselineSoftware)

   {

   $InstalledSoftware = $InstalledSoftware | where {$($_.ProductName) -eq $($software.ProductName) }

   }

$InstalledSoftware | Export-Csv -Path $PSScriptRoot\software.csv -NoTypeInformation

我也尝试过 Compare-Object cmdlet,但没成功。似乎有多种方法可以删除重复项,但不保留相似项。有人能帮忙吗?提前谢谢

答案1

您正在循环$InstalledSoftware中反复覆盖集合foreach。尝试

$AboveBaselineSoftware = Import-Csv $PSScriptRoot\AboveBaselineSoftware.csv
$InstalledSoftware     = Import-Csv $PSScriptRoot\ALLsoftware.csv

$ChosenSoftware = foreach ($software in $AboveBaselineSoftware)
   {
       $InstalledSoftware | where { $($_.ProductName) -eq $($software.ProductName) }
   }

$ChosenSoftware | Export-Csv -Path $PSScriptRoot\software.csv -NoTypeInformation

甚至

$AboveBaselineSoftware = Import-Csv $PSScriptRoot\AboveBaselineSoftware.csv
$InstalledSoftware     = Import-Csv $PSScriptRoot\ALLsoftware.csv

$ChosenSoftware = $InstalledSoftware | 
    Where-Object { $_.ProductName -in $AboveBaselineSoftware.ProductName }

$ChosenSoftware | Export-Csv -Path $PSScriptRoot\software.csv -NoTypeInformation

答案2

JosefZ 的简短版本;)

$AboveBaselineSoftware = Import-Csv $PSScriptRoot\AboveBaselineSoftware.csv

Import-Csv $PSScriptRoot\ALLsoftware.csv | Where ProductName -in $AboveBaselineSoftware.ProductName | Export-Csv $PSScriptRoot\software.csv -NoType

相关内容