herbstengel
Goto Top

Umleiten Pipelineergebnis in eine eigene Variable

Hallo liebe Community,

ich komme bei folgendem Vorhaben nicht so richtig weiter, es mangelt bei mir leider doch noch an Erfahrung mit der Powershell. Vermutlich ist das ganz einfach....

Ich möchten den nachfolgendenCode-Schnipsel so modifizieren, dass das Ergebnis am Ende der Pipeline von Attibut Reachable (true oder false) des Test-Connection commandlets in einem Array (connectionResult[..]) landet.
Das Array soll genaus viele elemente haben, wie die Anzahl von $counts und vom Typ Typ Bool sein.

 
[int]$counts = 4
[bool[]] $connectionResult = $false,$true,$false,$false

Test-Connection -ComputerName 192.168.178.11 -Count $counts -AsJob  | Get-Job | Receive-Job -Wait | Select-Object @{Name='ComputerName';Expression={$_.Address}},@{Name='Reachable';Expression={if ($_.StatusCode -eq 0) { $true } else { $false }}} | ft -AutoSize  

Auf der Konsole sieht die Ausgabe ja so aus:


ComputerName Reachable
---------------
192.168.178.1 True
192.168.178.1 True
192.168.178.1 True
192.168.178.1 True

Könnt ihr mir weiterhelfen?

Content-ID: 561985

Url: https://administrator.de/contentid/561985

Ausgedruckt am: 22.11.2024 um 03:11 Uhr

Daemmerung
Lösung Daemmerung 30.03.2020 um 23:17:18 Uhr
Goto Top
Hallo,

ich hoffe, ich hab dein Vorhaben richtig verstanden, wenn ja, wäre das folgendermaßen zu lösen:

[int]$counts = 4
[bool[]] $connectionResult = $false,$true,$false,$false

$result = (Test-Connection -ComputerName 192.168.178.11 -Count $counts -AsJob  | Get-Job | Receive-Job -Wait | Select-Object @{Name='ComputerName';Expression={$_.Address}},@{Name='Reachable';Expression={if ($_.StatusCode -eq 0) { $true } else { $false }}}).Reachable   
$result

Wenn du das gesamte Ergebnis als Objekt haben willst, musst du nur die runden Klammern + das ".Reachable" wegnehmen. Dann hast du in $result das gesamte Ergebnis.

Meintest du das so?

Viele Grüße
Toni
Herbstengel
Herbstengel 31.03.2020 um 09:19:39 Uhr
Goto Top
Hallo Toni,

danke für Deine Antwort. Das sieht schon mal ganz gut aus face-smile

$result liefert für www.google.de als ComputerName schon mal (für $counts =4)

True
True
True
True

Jetzt fehlt mir noch die Verbindung zur "eigenen" Array-Variablen $connectionResult[...]

Wenn ich das ganz einfach so mache (also direkte Zuweisung)

$connectionResult = $result

und auf ein Element $connectionResult[i] zugreife (i=0,1,2,3 für $count = 4), ist das Ergebnis scheinbar korrekt.

oder geht die Zuweisung umständlicher so (und vielleicht korrekter ??) Element für Element:

$connectionResult = $result.Item(0)
$connectionResult[1] = $result.Item(1)
....


Noch was: $connectionResult ist ja vom Typ Bool, $result ist vom Typ Variant. Wird das Typecasting so korrekt von der powershell vorgenommen?


Grüsse, Roger
Daemmerung
Lösung Daemmerung 31.03.2020 um 14:10:02 Uhr
Goto Top
Moin,

ich kann dir noch nicht so ganz folgen.

Wenn du folgende Zuweisung machst
$result = Test-Connection -ComputerName 192.168.178.11 -Count $counts -AsJob  | Get-Job | Receive-Job -Wait | Select-Object @{Name='ComputerName';Expression={$_.Address}},@{Name='Reachable';Expression={if ($_.StatusCode -eq 0) { $true } else { $false }}}  
kannst du mit
$result.Computername
den dazugehörigen Computernamen ermitteln. Über die Eigenschaft .Reachable weißt du, ob dieser Computer erreichbar war oder nicht.

Beispielsweise könntest du auch das $result-Objekt mit einer Foreach-Schleife durchgehen und die einzelnen Einträge überprüfen:
Foreach($row IN $result)
{
        if($row.Reachable -eq $true) { Write-Host $row.Computername " ist erreichbar..." }  
}

Viele Grüße
Toni
Herbstengel
Herbstengel 01.04.2020 um 09:47:43 Uhr
Goto Top
Hallo Toni,

vielen Dank. Hat mir alles sehr weitergeholfen.

viele Grüsse, Roger
Daemmerung
Daemmerung 01.04.2020 um 13:13:00 Uhr
Goto Top
Gerne und viele Grüße zurück. face-smile