排除PowerShell中CSV文件的值

我正在尝试确定如何从基于CSV文件的数组中排除值。 到目前为止,这是最好的select:

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

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

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

它工作正常。 我确信我犯了一个愚蠢的错误,但我无法弄清楚。 🙂

$ objIgnore.Name是否存在? 检查$ objIgnore.Name的输出,并确保它包含你认为它的作用。 我认为$ objIgnore.Name可能是空的。 如果没有,你仍然可能需要将它从PSObject中转换为string。 这个输出是什么?

 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 

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

例如:

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

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