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
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