在 PowerShell 中从 CSV 文件中排除值

在 PowerShell 中从 CSV 文件中排除值

我正在尝试确定如何根据 CSV 文件从数组中排除值。这是我目前最好的选择:

$arrIgnore = import-csv "ignore.csv"

foreach($objIgnore in $arrIgnore){
    $objAll = $objAll | where {$_.Name -ne $objIgnore.Name}
}

这不会从数组中过滤掉单个项目。如果我用字符串中的值写出问题:

$objAll = $objAll | where {$_.Name -ne "value1"}
$objAll = $objAll | where {$_.Name -ne "value2"}

它工作正常。我确信我犯了一个愚蠢的错误,但我搞不清楚。:-)

答案1

$objIgnore.Name 是否存在?检查 $objIgnore.Name 的输出,确保它包含您认为的内容。我认为 $objIgnore.Name 可能为空。如果不是,您可能仍需要将其从 PSObject 转换为字符串。这会输出什么?

foreach($objIgnore in $arrIgnore){
    $objIgnore.Name
}

我能够让以下代码按您的期望工作。

$arrIgnore = import-csv ".\ignore.csv"
$objAll = import-csv ".\all.csv"

foreach($objIgnore in $arrIgnore){
     $objAll = $objAll | where {$_.Name -ne $objIgnore.Name}
}

其中 ignore.csv 包含

Name  
srv1  
srv2  
srv3  
srv4  
srv5

并且 all.csv 包含

Name 
srv1 
srv2 
srv3 
srv4 
srv6 
srv5 
srv7 
srv8 
srv9 
srv10

完成后,$objAll 返回

Name 
---- 
srv6 
srv7 
srv8 
srv9 
srv10

答案2

仅供参考,更简单的方法是将 -notcontains 运算符与要忽略的字符串数组一起使用。

例如:

$array = @('value1','value2','value3','value4','value5')
$array | Where-Object {@('value2','value3') -notcontains $_}

这将遍历包含所有对象的数组一次,而不是对每个要排除的值遍历一次。

相关内容