PowerShell从CSV中删除行
我在内部运行一个脚本,以获取组织LAN段上的SystemName及其模型。下面是示例CSV文件PowerShell从CSV中删除行,powershell,Powershell,我在内部运行一个脚本,以获取组织LAN段上的SystemName及其模型。下面是示例CSV文件 "SystemName","Model" "DELL-10110","DELL Optiplex" "DELL-10111","DELL Optiplex" "Lenovo-30119","Lenovo ThinkCentre" "D
"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:\IT\Inventory.csv | ForEach-Object {
[PSCustomObject]@{
SystemName = $_.SystemName
Model = $_.Model
}
}
$DATA | Where-Object {$_.SystemName -ne "*HP*"} | Export-Csv -NoTypeInformation -Path C:\IT\Inventory-New.csv
正如@Theo所提到的,问题肯定出在比较运算符
-ne
中@西奥的评论是一个可以接受的解决方案,但我要指出这里有很多不必要的东西Import Csv
已经输出PSCustomObjects,没有理由在ForEach对象
循环中创建新对象。一旦意识到这一点,您就可以将其压缩为单个管道,如:
Import-CSv 'C:\IT\Inventory.csv' |
Where-Object{ $_.SystemName -notmatch '^HP' } |
Export-Csv -NoTypeInformation -Path 'C:\IT\Inventory-New.csv'
注意:即使您需要的对象只有原始属性的一个子集,我也会在创建新对象之前使用选择对象
<代码>选择对象还输出PSCustomObjects
在上面的示例中,我使用了
-notmatch
和正则表达式锚^
。Where子句实际上意味着Where不以“HP”开头。然而,这只是为了演示<代码>-不象“*HP*”或“HP*”
可能同样有效,这取决于您的数据。使用-不象“*HP*”
,而不是-ne
。