PowerShell从CSV中删除行



我在内部运行一个脚本来获取组织LAN段上的SystemName及其模型。以下是示例CSV文件:

"SystemName","Model"
"DELL-10110","DELL Optiplex"
"DELL-10111","DELL Optiplex"
"Lenovo-30119","Lenovo ThinkCentre"
"DELL-10112","DELL Optiplex"
"HP-21011","HP Prodesk"
"HP-21012","HP Prodesk"

并且我运行另一个Powershell脚本来导入CSV文件并删除整个行,如果SystemName包含HP。但是输出的CSV文件仍然有HP系统。

$DATA = Import-CSv C:ITInventory.csv | ForEach-Object {
[PSCustomObject]@{
SystemName = $_.SystemName
Model = $_.Model
}
}
$DATA | Where-Object {$_.SystemName -ne "*HP*"} | Export-Csv -NoTypeInformation -Path C:ITInventory-New.csv

正如@Theo所提到的,问题肯定出在比较运算符-ne上。@Theo的评论是一个可以接受的解决方案,但我要指出这里有很多不必要的东西。Import-Csv已经输出PSCustomObjects,没有理由在ForEach-Object循环中创建新对象。一旦意识到这一点,您可以将其压缩为单个管道,如:

Import-CSv 'C:ITInventory.csv' | 
Where-Object{ $_.SystemName -notmatch '^HP' } |
Export-Csv -NoTypeInformation -Path 'C:ITInventory-New.csv'

注意:即使您只需要具有原始属性子集的对象,我也会在创建新对象之前使用Select-ObjectSelect-Object也输出PSCustomObjects。

在上面的示例中,我使用-notmatch和RegEx锚^。Where子句的意思是Where不以"h&p"开头。不过,这只是为了演示。-notlike "*HP*""HP*"也可以工作,这取决于你的数据。

最新更新