我目前正在编制一份计算机上安装的软件列表。我的最终目标是过滤掉所有基线软件,以便获得准确的安装报告。我不得不搜索注册表的一个区域,该区域捕获了安装过程中输入的大量额外信息。最初,我创建了一个“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