我正在尝试确定如何根据 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 $_}
这将遍历包含所有对象的数组一次,而不是对每个要排除的值遍历一次。