2017-06-21 3 views
0

ich eine SQL-Abfrage haben, die Device, primäre, sekundäre und tertiäre aus einer Tabelle zieht: mit dem primärenWie leere Einträge filtern zurück von DB Abfrage

$SQLQuery= (Invoke-Sqlcmd -Serverinstance $ServerInstance -Database $Database -Query "select DeviceName, Primary, Secondary, Tertiary from dbo.Table") 

ich dann werfen die Einträge in einer Hash-Tabelle/sekundäre/tertiäre als Array im Wert:

$DeviceList = @{} 
foreach ($item in $SQLQuery) 
{ 
if($item.Primary -and $item.Secondary -and $item.Tertiary) 
{ 
    $DeviceList += @{$item.DeviceName = "$($item.Primary)", "$($item.Secondary)", "$($item.Tertiary)"} 
} 
elseif ($item.Primary -and $item.Secondary -and !$item.Tertiary) 
{ 
    $DeviceList += @{$item.DeviceName = "$($item.Primary)", "$($item.Secondary)"} 
} 
elseif ($item.Primary -and !$item.Secondary -and !$item.Tertiary) 
{ 
    $DeviceList += @{$item.DeviceName = "$($item.Primary)"} 
} 

das Problem, das ich in laufende bin ist, dass die SQL-Abfrage leer Ergebnisse zurückgeben kann, die nicht NULL sind. Das macht $DeviceList sieht wie folgt aus:

$devicelist = @{ 
    "Device1" = "[email protected]"; 
    "Device7" = "[email protected]"; 
    "Device8" = "[email protected]"; 
    "Device2" = "[email protected]", "[email protected]"; 
    "Device3" = "[email protected]", ""; 
    "Device4" = "[email protected]", "", "[email protected]"; 
    "Device5" = "[email protected]", "[email protected]", "[email protected]"; 
    "Device6" = "[email protected]", "[email protected]", "" 
} 

ich diese durch das Werfen in einer repetitiven filtern kann, wenn Aussage wie:

elseif ($item.Primary -and !$item.Secondary -and !$item.Tertiary) 
{ 
    if($item.Primary -ne '') 
    { 
    $DeviceList += @{$item.DeviceName = "$($item.Primary)"} 
    } 
} 

aber das ist unglaublich repetitive und zeitaufwendig. Ich kann auch die SQL-Abfrage ändern, um diese zu ignorieren, aber ich bevorzuge es, die SQL-Abfrage einfach zu halten und die Filterung in PowerShell durchzuführen. Es muss einen einfacheren Weg geben, das zu tun.

Das Endergebnis, das ich suche, ist, dass, wenn der Eintrag leer ist, es wird einfach übersprungen, so würde $DeviceList dies wie folgt aussehen:

$devicelist = @{ 
    "Device1" = "[email protected]"; 
    "Device7" = "[email protected]"; 
    "Device8" = "[email protected]"; 
    "Device2" = "[email protected]", "[email protected]"; 
    "Device3" = "[email protected]"; 
    "Device4" = "[email protected]", "[email protected]"; 
    "Device5" = "[email protected]", "[email protected]", "[email protected]"; 
    "Device6" = "[email protected]", "[email protected]" 
} 

Wenn meine Frage macht keinen Sinn, bitte lass es mich wissen und ich werde versuchen zu klären. Wie immer, danke !!

Antwort

2

Aufbau die Liste pro Gerät inkrementell:

$DeviceList = @{}; 
foreach ($item in $SQLQuery) 
{ 
    $arr = @(); 
    if($item.Primary -ne $null -and $item.Primary -ne [System.DBNull]::Value -and $item.Primary -ne '') 
    { 
     $arr += "$($item.Primary)"; 
    } 
    if($item.Secondary -ne $null -and $item.Secondary -ne [System.DBNull]::Value -and $item.Secondary -ne '') 
    { 
     $arr += "$($item.Secondary)"; 
    } 
    if($item.Tertiary -ne $null -and $item.Tertiary -ne [System.DBNull]::Value -and $item.Tertiary -ne '') 
    { 
     $arr += "$($item.Tertiary)"; 
    } 
    if ($arr.count -gt 0) 
    { 
     $DeviceList += @{$item.DeviceName = $arr}; 
    } 
} 

bin ich nicht sicher, ob Invoke-Sqlcmd wird NULL oder DBNull zurückkehren, also habe ich einen Scheck für beide enthalten.

+0

Andy, deine erste Antwort funktionierte perfekt, nachdem ich '$ arr = @ {}' in '$ arr = @()' geändert hatte. Du hast mein Leben so viel einfacher gemacht, vielen Dank !! – Nick

0

Ein Beispiel mit WMI, da habe ich nicht SQL installiert:

(Get-WMIObject -Class Win32_Bios).PSObject.Properties|? Value -ne $NULL|ft Name, Value 

Dies wird die Nicht-Null-Eigenschaften nur zurück, sondern alle Win32_Bios Klasse Funktionalität verlieren. Ich nehme an, das sollte in Anbetracht des Kontexts Ihres Codes in Ordnung sein.

Verwandte Themen