【问题标题】:PowerShell to remove row from CSVPowerShell 从 CSV 中删除行
【发布时间】:2021-01-23 08:44:47
【问题描述】:

我在内部运行一个脚本来获取我的组织 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"

如果 SystemName 包含 HP,我会运行另一个 Powershell 脚本来导入 CSV 文件并删除整行。但是输出的 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

【问题讨论】:

  • 使用-notlike '*HP*',而不是-ne

标签: powershell


【解决方案1】:

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

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

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

在上面的示例中,我使用了-notmatch 和正则表达式锚^。 Where 子句实际上意味着 where 不以“HP”开头。但是,这只是为了演示。 -notlike "*HP*""HP*" 可能同样有效,具体取决于您的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2016-06-05
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多