0

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

overflowed
  • 1,095
  • 1
  • 18
  • 39

1 Answers1

1

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   
Doug Maurer
  • 8,090
  • 3
  • 12
  • 13