Powershell -or funktioniert nicht

Reinhard77

Lieutenant
Registriert
Feb. 2019
Beiträge
849
Hallo,

ich wollte mal wissen, ob ihr wisst, wieso folgendes PowerShell Skript nicht funktioniert.
Ich sehe da keinen Fehler und an meinem privaten PC funktioniert es auch?!

Hier eine kleine Funktion, zum überprüfen ob eine Internetverbindung besteht:

An dem PC wo es nicht lief, machte das -or Probleme. Sobald ich in der If Abfrage zwei Bedingungen mit -or habe, gibt es immer $false aus anstatt $true, wenn eine der beiden Bedingungen gegeben ist.

PowerShell:
function CheckInternet
{
    [string]$pingCloudfare = (ping 1.1.1.1 -n 1)
    [string]$pingGoogle = (ping 8.8.8.8 -n 1)

    if($pingCloudfare -match "TTL=" -or $pingGoogle -match "TTL=")
    {
        $result = $true
        Write-Host "Internetverbindung OK."
    }
    else
    {
        $result = $false
        Write-Host "Keine Internetverbindung."
    }
    return $result
}

CheckInternet

Habe den Fehler korrigiert und so sah es aus, als dieses Problem auftrat!
 
Zuletzt bearbeitet:
du prüfst zweimal cloudflare in deiner if-abfrage.
wenn also nur google online wäre bzw. realistischer cloudflare down ist, wird es dir hier immer ein false ausgeben.
bei mir funktioniert das angepasste script einwandfrei.
 
  • Gefällt mir
Reaktionen: Korben2206 und areiland
Und bitte nicht mit or arbeiten bei sowas... genau weil das dann passiert, was Redundanz gemerkt hat (er hat die Redundanz erkannt).

Code:
$addresses = @{
   "cloudflare" = "1.1.1.1";
   "google" = "8.8.8.8";
}

function CheckInternet
{
    foreach($k in $addresses.Keys) {
        $address = $addresses[$k]
        [string]$ping = (ping $address -n 1)
        if ($ping -match "TTL=") {
            return $true
        }
    }
    return $false
}

CheckInternet

(eigentlich ist ein assoziatives array hier overkill)
 
Redundanz schrieb:
du prüfst zweimal cloudflare in deiner if-abfrage.
wenn also nur google online wäre bzw. realistischer cloudflare down ist, wird es dir hier immer ein false ausgeben.
bei mir funktioniert das angepasste script einwandfrei.

Ach, das war ein Copy Paste Fehler. Natürlich waren in der Version an der dieses Problem auftrat die zwei unterschiedlichen Bedingungen in dem IF Zweig richtig eingetragen.

Also so:
PowerShell:
function CheckInternet
{
    [string]$pingCloudfare = (ping 1.1.1.1 -n 1)
    [string]$pingGoogle = (ping 8.8.8.8 -n 1)

    if($pingCloudfare -match "TTL=" -or $pingGoogle -match "TTL=")
    {
        $result = $true
        Write-Host "Internetverbindung OK."
    }
    else
    {
        $result = $false
        Write-Host "Keine Internetverbindung."
    }
    return $result
}

CheckInternet
 
Zuletzt bearbeitet:
tollertyp schrieb:
Und bitte nicht mit or arbeiten bei sowas... genau weil das dann passiert, was Redundanz gemerkt hat (er hat die Redundanz erkannt).

Und wozu gibt es dann -or, wenn es nicht genutzt werden soll?
Ergänzung ()

tollertyp schrieb:
Und genau deshalb sollte man Redundanz vermeiden. Ich meine jetzt nicht den User.

Eure Antworten erklären nicht, wieso es nicht funktioniert, wo ich an einem anderen PC diese Funktion getestet habe.
 
Ich sagte "bei sowas" ...

und meine Variante kommt ohne -or aus, ist das -or wichtig für dich?
 
Ich finde -or völlig in Ordnung.
 
Zuletzt bearbeitet:
Ja, und es viel fehleranfälliger ist, wie du bereits bewiesen hast. Und es wichtig ist, auch immer alle pings durchzuführen, auch wenn der erste schon erfolgreich ist.

Welche Powershell wird denn auf welchem System verwendet?
 
tollertyp schrieb:
Ja, und es viel fehleranfälliger ist, wie du bereits bewiesen hast.

Ich habe hier grad gar nix bewiesen. Ich hab zugegeben, dass mir auch Flüchtigkeitsfehler passieren.

Eher warte ich noch auf einen Beweis, was ich falsch gemacht haben soll.

Ich finde es halt besser Code zu schreiben, den ich auch später noch verstehe, wenn ich nicht mehr im Thema bin.
 
tollertyp schrieb:
Welche Powershell wird denn auf welchem System verwendet?
Das könntest du noch beantworten.

Und gerade wenn man Code länger mal nicht anschaut, ist es eben sinnvoll, wartbaren Code zu schreiben, damit man nicht mehr an alle Dinge denken muss. Deiner strozt halt vor Redundanz.
 
tollertyp schrieb:
Das könntest du noch beantworten.

Kann ich jetzt nicht, da ich den Rechner nicht hier habe.
Ergänzung ()

tollertyp schrieb:
Und es wichtig ist, auch immer alle pings durchzuführen, auch wenn der erste schon erfolgreich ist.

Das sehe ich ein. Da wäre dann die Frage, wie arbeitet eine IF Abfrage mit -or in Powershell? Wenn die erste Bedingung schon zutrifft, wird die zweite gar nicht ausgeführt? Dann wäre das -or ja Unsinn.
 
Zuletzt bearbeitet:
Die Ausführung findet ja vor dem if statt.
Das if wertet nur die Strings aus. Ausgeführt werden die pings in den Zeilen davor. Kannst ja mal Write-Host immer machen um zu sehen, wo das Script ist, und die Dauer des Pings erhöhen.

Was weißt du denn konkret über den "Ziel-PC"?
 
Abseits der -or Diskussion: Wie wäre es denn mit den eingebauten PowerShell-Befehlen?

PS C:\Users\rowi> test-connection 8.8.8.8 -quiet
True
PS C:\Users\rowi> test-connection 1.1.1.1 -quiet
True

get-help test-netconnection -Examples
 
  • Gefällt mir
Reaktionen: aragorn92 und tollertyp
tollertyp schrieb:
Die Ausführung findet ja vor dem if statt.

Dann werden ja beide pings immer gemacht und das Skript funktioniert so wie es soll. Mir reicht das. Von mir aus kann da auch eine for each Geschichte rein für die beiden Strings...

tollertyp schrieb:
Was weißt du denn konkret über den "Ziel-PC"?

Das müsste ein Windows Server 2022 Standard sein auf dem neuesten Patch Level.
 
Also mit test-connection und ohne assoziatives array sähe es so aus:

Code:
$addresses = @(
   "1.1.1.1", # Cloudflare
   "8.8.8.8"  # Google
)
function CheckInternet
{
    foreach($ip in $addresses) {
        if (test-connection $ip -quiet) {
            return $true;
        }
    }
    return $false;
}
CheckInternet

Viel wartungsfreundlicher dürfte es kaum werden.

Zum Ziel-PC:
Aber ohne das "-or" (und der Bedinung) läuft das Script erfolgreich?
 
  • Gefällt mir
Reaktionen: aragorn92
tollertyp schrieb:
Und gerade wenn man Code länger mal nicht anschaut, ist es eben sinnvoll, wartbaren Code zu schreiben, damit man nicht mehr an alle Dinge denken muss. Deiner strozt halt vor Redundanz.

Das mit dem wartbaren Code kann man einsehen. Erleichtert aber nicht den Einstieg in einer Sprache.
Ergänzung ()

tollertyp schrieb:
Viel wartungsfreundlicher dürfte es kaum werden.

Dein Code gefällt mir auch sehr gut, meiner ist aber schneller :D
 
Zuletzt bearbeitet:
Dann mach es halt so...
Code:
$addresses = @(
   "1.1.1.1", # Cloudflare
   "8.8.8.8"  # Google
)
function CheckInternet
{
    foreach($ip in $addresses) {
        if (test-connection $ip -Count 1) {
            return $true;
        }
    }
    return $false;
}
CheckInternet

so viel zu "schneller". Jetzt ist deins aber langsamer...

1712420517153.png

logisch, da wie gesagt immer zwei mal gepingt wird (die Ausgabe sind ms, sicherlich nicht relevant der Unterschied).
 
tollertyp schrieb:
so viel zu "schneller". Jetzt ist deins aber langsamer...

Bei den Varianten nicht von mir, sind ja auch keine Write-Host Befehle drin. Wenn du die mit rein nimmst, dann wird dein Code minimal langsamer.
 
Zuletzt bearbeitet:
Ich habe bei manchen PCs das Problem, dass die DOS Befehle nicht inline sondern out of Band ausgeführt werden. Warum auch immer.

Wenn das passiert, dann liefern die Befehle gar nichts zurück, weder Return Code noch die Ausgabe. Entsprechend würde Ping nichts an PS liefern.
 
Zurück
Oben