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-Key: 561985

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

Printed on: April 19, 2024 at 18:04 o'clock

Member: Daemmerung
Solution Daemmerung Mar 30, 2020 at 21:17:18 (UTC)
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
Member: Herbstengel
Herbstengel Mar 31, 2020 at 07:19:39 (UTC)
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
Member: Daemmerung
Solution Daemmerung Mar 31, 2020 at 12:10:02 (UTC)
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
Member: Herbstengel
Herbstengel Apr 01, 2020 at 07:47:43 (UTC)
Goto Top
Hallo Toni,

vielen Dank. Hat mir alles sehr weitergeholfen.

viele Grüsse, Roger
Member: Daemmerung
Daemmerung Apr 01, 2020 at 11:13:00 (UTC)
Goto Top
Gerne und viele Grüße zurück. face-smile