Search code examples
powershellhashtable

Powershell - Remove Blank line from hash property variable


I created a script to collect remote SQL servers

#### Get number of SQL servers


$sql_servers = @()

 foreach ($server in $servers){

 # Loop through each server and check if server has service "MSSQLSERVER"

 Try{

     $sql = get-service -computername $server.DNSHOstname -ErrorAction Stop | where {$_.Name -eq "MSSQLSERVER"} | select MachineName 
     $sql_servers += New-Object PSObject -Property @{
            
            Machine = $sql.MachineName
        }
       }

 catch [Exception]
{
    if ($_.Exception.GetType().Name -like "*COMException*") {
         Write-Verbose -Message ('{0} is unreachable' -f $server.DNSHOstname) -Verbose
    }
    else{
         Write-Warning $Error[0]
    }
 }
 }

I'm getting desired results but variable contains multiple empty lines:

 $sql_servers 

Machine                       
-------                       
                              
                              
SQL1   
                              
                              
                              
                              
                              
SQL2 
SQL3
     

                     
                          

I tried following to remove those blank lines without success.

$sql_servers = $sql_servers | Where-Object {$_}
$sql_servers = $sql_servers | ? {$_ -ne ""}
                      

How to remove empty (blank) lines from variable ?

EDIT:

I found a workaround by removing hashtable property, instead of

 $sql_servers += New-Object PSObject -Property @{
                
                Machine = $sql.MachineName
            }
           }               
              

i just set $sql_servers += $sql and no empty lines, but i'm curious is it possible to remove empty line using hash table.

Thanks


Solution

  • First thing to point out is your variable $sql_servers does not contain hashtables, but rather PSCustomObjects with one property. For this specific scenario you could remove empty entries by adjusting your command to

    $sql_servers = $sql_servers | Where-Object {$_.machinename}
    

    If it were hashtables, you could use

    $sql_servers = $sql_servers | Where-Object {$_.values}
    

    Here is a simple demonstration of both.

    PSObject

    1..5 | % {
        if($_ % 2 -eq 0)
        {
            $num = $_
        }
        else
        {
            $num = $null
        }
        [PSCustomObject]@{
            MachineName = $num
        }
    } -ov sql_servers
    
    MachineName
    -----------
           
    2          
           
    4          
    
    
    $sql_servers | ? {$_.machinename} -ov sql_servers
    
    MachineName
    -----------
              2
              4   
    

    Hashtable

    1..5 | % {
        if($_ % 2 -eq 0)
        {
            $num = $_
        }
        else
        {
            $num = $null
        }
        @{
            MachineName = $num
        }
    } -ov sql_servers
    
    Name                           Value                                                                                                                            
    ----                           -----                                                                                                                            
    MachineName                                                                                                                                                     
    MachineName                    2                                                                                                                                
    MachineName                                                                                                                                                     
    MachineName                    4                                                                                                                                
    MachineName                                                                                                                                                     
    
    
    $sql_servers | ? {$_.values} -ov sql_servers
    
    Name                           Value                                                                                                                            
    ----                           -----                                                                                                                            
    MachineName                    2                                                                                                                                
    MachineName                    4