Wertzuweisung in einer Batchfile?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Batch ist "etwas" anders als Hochsprachen, wenn es darum geht den Output von Kommandozeilenprogrammen an eine Variable zu übergeben. Nix mit : set Variable= Programm . In Batch erfolgt das Filtern "horizontale" Filtern einer einer Programm-Output-Zeile mit dem, For/f-Loop und (optional) dessen Tokens/Delims -optionen. Schwere Kost für jeden Anfänger.

aber erstmal zu Deinem find-filter ...

ping -4 -n 1 www.google.de | find /C "0%% Verlust"

Dir ist schon klar, das dieser lediglich die Anzahl der Zeilen liefert in denen "0% Verlust" vorkommt (das betrifft aber auch 10%,..90%,100%). 1 wenn es keinen Verlust (mit 0 am Ende) gab, 0 bei Verlusten, welche keine 0 beinhalten. Was anderes geht nicht...

...also schaufeln wir mal den Output unseres Kommandos in eine Variable:

demo.cmd

for /f   %%a in ('ping -4 -n 1 www.google.de ^|find /C "0%% Verlust"') do (
    set "numInternet=%%a"
)
echo deine Variable hat den Wert: %numInternet%!
pause

Falls Dein Ansinnen dahin gehen sollte den "Verlustwert" in eine Variable zu speichern, musst du erstmal den find-Filter allgemeiner gestalten: "Verlust" und anschließend den numerischen Wert aus der Zeile herausfiltern.

for /f "tokens=1 delims=%%() " %%a in ('ping -4 -n 1 www.google.de ^|find "Verlust"') do (
  set "Verlust=%%a"
)
echo deine Variable hat den Wert: %Verlust% !

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Craven120 
Fragesteller
 23.03.2023, 10:55

Vielen Dank für deine Antwort und die Hilfe.
Dass die Wertezuweisung mit einer for-Scheife umgesetzt wird, ist... gewöhnungsbedürftig.
Der Hinweis mit dem Finden von "0% Verlust" auch bei mod(x, 10) = 0 hatte ich natürlich nicht bedacht. Insofern ist dein zweiter Ansatz sehr charmant, allerdings bekomme ich bei fehlender Internetverbindung keinen "Verlust=100" - die Variable scheint leer zu bleiben. Bei bestehender Internetverbindung bekomme ich den korrekten Wert "0" ausgegeben.

0
Erzesel  23.03.2023, 11:13
@Craven120

...dann nimm doch die vorangestellte Klammer mit in das Suchkriterium: find /C "(0%% Verlust" schon ist das "mod 10-problemchen" erledigt.

Im zweiten Beispiel ist die nicht gesetzte Variable ein Indikator dafür, das kein Text mit dem Wort "Verlust" aufgetreten ist (100% wirds wohl nicht geben da kommt eher eine Fehlermeldung) Wenn es nichts gibt, was der For/f-Header liefert, wird der Body auch nie ausgeführt...

ergo behält die Variable den alten wert ...in der Regel nix:

if "%Verlust%"=="" echo nix
1

Nur mal als Tipp vorweg: Nimm Batch nur für einfachste Scripte (Dateien kopieren/löschen, Programme starten etc.). Wenn du was programmieren möchtest, nimm dafür lieber PowerShell. Das ist bei Windows dabei.

Für deine eigentliche Frage: Ping gibt (wie jedes Programm) beim Beenden einen exit-Code ans System zurück. Der exit-Code steht dann in der Variable %errorlevel%. Du brauchst also nicht kompliziert die Ausgaben zu parsen, sondern kannst einfach schauen, ob in %errorlevel% eine 0 steht (das heißt, das Programm ist ohne Fehler gelaufen, bzw. der ping hat eine Antwort erhalten) oder ob eine andere Zahl drinsteht (z.B. 1 heißt, dass der ping keine Antwort gekriegt hat oder -1073741510 heißt, dass der ping vom Benutzer mit Strg-C abgebrochen wurde)

Also machst du z.B. sowas:

@echo off
ping -4 -n 1 www.google.de
set numInternet=%errorlevel%

In numInternet steht dann entweder 0 für "erfolgreich" oder was anderes für "nicht erfolgreich".

Craven120 
Fragesteller
 23.03.2023, 11:00

Auch dir vielen Dank für deine Antwort.
Mein eigentliches Ziel ist, herauszufinden, ob eine Internetverbdinung besteht, oder nicht. Falls nicht, brich mit einer Fehlermeldung ab. Falls ja, continue.
Anschließend will ich ermitteln, ob ich mich in meinem Heimnetz befinde, oder nicht. Falls ja, stelle eine gewöhnliche Remote Desktopverbindung her. Falls nein, baue einen VPN-Tunnel auf und stelle anschließend die Remote-Desktopverbdinung her.
Abschließend: prüfe, ob die Remote-Desktop-Verbindung geschlossen wurde und schließe den VPN-Tunnel.
Notwendig ist das alles nicht, sondern eher eine private Spielerei. Dein Ansatz, mit den exit-Codes zu arbeiten, ist noch smarter und funktioniert auch hervorragend, sodass ich damit weiterarbeiten werde.
Vielen Dank für deine Hinweise und Hilfe.

0