Search code examples
powershell

How do I filter my system.array with where-object


I thought this would be straightforward, just filtering my array, smh.

$serverEnv.GetType()
IsPublic IsSerial Name                                     BaseType                                                                 
-------- -------- ----                                     --------                                                                 
True     True     Object[]                                 System.Array                                                             


# This is what I'm getting
ComputerName Env 
------------ --- 
server1      PROD
server1           
server2      PROD
     
    
# I'm trying  to get all servers that don't have a null or empty Env 

ComputerName Env 
------------ --- 
server1      PROD         
server2      PROD


# Tried this, but getting the ssame list with the blank Env records
$serverEnv | where-object { $_.Env -ne $null -or $_.Env -ne "" }

Solution

  • It's a logic problem. -and, not -or ($_.env -eq "" in this case) (beware of arrays on the left side of -ne):

    $serverenv = 'computername,env
    server1,prod
    server1,
    server2,prod' | convertfrom-csv 
    
    $serverenv | where-object { $_.Env -ne $null -or $_.Env -ne "" }
    
    computername env
    ------------ ---
    server1      prod
    server1
    server2      prod
    
    
    $serverenv | where-object { $_.Env -ne $null -and $_.Env -ne "" }
    
    computername env
    ------------ ---
    server1      prod
    server2      prod
    

    You could put a list on the left:

    $serverenv | where-object { $null,"" -ne $_.env }
    
    computername env
    ------------ ---
    server1      prod
    server2      prod
    
    

    I was trying backquote zero, but that seems the same as empty space.

    "`0" -eq ''
    
    True