如何使用Where-Object过滤System.Array数组,排除Env字段为空或Null的记录
如何使用Where-Object过滤System.Array数组,排除Env字段为空或Null的记录
兄弟,你这问题根源在于逻辑运算符用错啦!你写的-or会导致空Env的记录被意外保留,咱们来一步步捋清楚:
你的错误原因
你之前的过滤语句:
$serverEnv | where-object { $_.Env -ne $null -or $_.Env -ne "" }
这里用-or意味着只要满足其中一个条件就会保留记录。比如当Env是空字符串时,$_.Env -ne $null是true,所以这条记录会被留下来;同样,当Env是null时,$_.Env -ne ""是true,也会被保留。这就是为什么你还是能看到空Env的条目。
正确的过滤写法
给你三种可行的方案,按需选择:
方案1:修正逻辑运算符为-and
要排除“Env是null”并且“Env是空字符串”的记录,正确的逻辑应该是两个条件都不满足,所以用-and:
$serverEnv | Where-Object { $_.Env -ne $null -and $_.Env -ne "" }
方案2:利用PowerShell的隐式布尔转换
在PowerShell里,null、空字符串""都会被视为false,所以直接判断$_.Env是否为“真”即可,写法更简洁:
$serverEnv | Where-Object { $_.Env }
方案3:使用.NET静态方法明确判断
如果想要更清晰地表达“排除空或null的字符串”,可以用[string]::IsNullOrEmpty()方法,取反即可:
$serverEnv | Where-Object { -not [string]::IsNullOrEmpty($_.Env) }
执行后你会得到期望的结果:
ComputerName Env
server1 PROD
server2 PROD
备注:内容来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

