Batch - mehrere Fragen zur Umsetzung einer Idee
Hallo Leute,
ich versuche, mehr über die Batch-Programmierung zu lernen und habe dazu ein script geschrieben.
Dieses Funktioniert gut, soll jetzt aber erweitert werden.
Hier erst mal der Code, damit ihr wisst, wovon ich rede:
Kurze erklärung zum Script:
Ich pinge eine Liste von IPs an, ein Aussetzer wird protokolliert, ist eine IP dauerhaft nicht erreichbar, wird ein Bild geöffnet und die Farbe des CMD wird rot.
Jetzt möchte ich das erweitern und stoße auf Probleme, wo ich mich gern mit euch austauschen möchte.
Gesetztes Ziel:
z.B. ein Server wird neu gestartet. Das Script wird rot, das Bild wird geöffnet.
Server ist wieder da, cmd wird wieder schwarz, als Erinnerung, dass da was war, bleibt das Bild geöffnet.
Hier scheitere ich an der Umsetzung.
Ich habe folgendes versucht:
Schlägt der letzte Ping fehl, schreibe ich die IP (%%f) in eine %Error-IP%
Nach
habe ich eine Abfrage eingebaut:
Wohin jetzt mit dem :1?
Zuerst hatte ich es ganz ans Ende, nach dem letzen "goto start" gesetzt. Funktioniert nicht, weil die For-Schleife die IP-Liste nicht weiter abarbeitet, sondern von vorn beginnt.
Danach hab ich :1 vor die letzte schließende Klammer der Schleife gepackt. Ist aber auch nur bedingt erfolgreich, da jetzt das Log überquillt.
Die IP-Liste wird zwar jetzt abgearbeitet aber nur noch über :1
Wie könnte ich das lösen???
Ich bin auf euren Input gespannt!
Ein 2. Problem ist, dass ich das Bild eigendlich nicht über GIMP öffnen möchte. Hier würde ich gerne z.B. das bordeigene "Fotos" verwenden. Da es aber eine Windows-APP ist, ist es keine exe.
Viele Grüße
Tom
ich versuche, mehr über die Batch-Programmierung zu lernen und habe dazu ein script geschrieben.
Dieses Funktioniert gut, soll jetzt aber erweitert werden.
Hier erst mal der Code, damit ihr wisst, wovon ich rede:
@echo off
setlocal enabledelayedexpansion
REM Script zum Überprüfen verschiedener IP-Adressen auf Heartbeat
echo Pingtest - Ping-Aussetzer werden protokolliert
echo ==============================================
echo/
echo/
set Log=%userprofile%\Desktop\IP-Scripte\pingtest.txt
echo/ >> %Log%
echo/ >> %Log%
echo Pingtest-Start: %Date% - %Time% >> %Log%
echo/
echo Liste der anzupingenden IPs >> %Log%
echo/ >> %Log%
for /f %%t in (ip.list) do (
echo %%t >> "%Log%"
)
echo/ >> %Log%
:start
for /f %%f in (ip.list) DO (
for /f "delims=" %%i in ('ping -n 1 %%f^|findstr "berschreitung Fehler Zielhost"') do (
echo %%f - %Date% - %Time% - %%i && echo %%f - %Date% - %Time% - %%i >>%Log%
REM Wenn Zielhost nicht erreichbar wird intensiver geprüft
echo teste erneut >>%Log%
ping %%f -n 1 | find "TTL"
if !errorlevel!==0 (
echo %%f - %Date% - %Time% - erreichbar, war nur kurzer Aussetzer >>%Log%
goto start
) else (
echo %%f - Ping 1 von 4 - %Date% - %Time% - immer noch nicht erreichbar, teste erneut >>%Log%
ping %%f -n 1 | find "TTL" >nul
)
if !errorlevel!==0 (
echo %Date% - %Time% - %%f - wieder erreichbar >>%Log%
goto start
) else (
echo Ping 2 von 4 - %Date% - %Time% - %%f - immer noch nicht erreichbar >>%Log%
ping %%f -n 1 | find "TTL" >nul
)
if !errorlevel!==0 (
echo %Date% - %Time% - %%f - wieder erreichbar >>%Log%
goto start
) else (
echo Ping 3 von 4 - %Date% - %Time% - %%f - immer noch nicht erreichbar >>%Log%
ping %%f -n 1 | find "TTL" >nul
)
if !errorlevel!==0 (
echo %Date% - %Time% - %%f - wieder erreichbar >>%Log%
goto start
) else (
echo Ping 4 von 4 - %Date% - %Time% - %%f - dauerhaft nicht erreichbar! >>%Log%
color 4E
echo/ >>%Log% && echo/ >>%Log%
tasklist | find /i "gimp-2.10.exe" >nul
if !errorlevel! == 0 (
echo "Gimp" leauft, Fehlerbild wird bereits gezeigt.
) else (
Start "" "%userprofile%\Pictures\network_global_fail_error.bmp"
)
)
)
)
goto start
Kurze erklärung zum Script:
Ich pinge eine Liste von IPs an, ein Aussetzer wird protokolliert, ist eine IP dauerhaft nicht erreichbar, wird ein Bild geöffnet und die Farbe des CMD wird rot.
Jetzt möchte ich das erweitern und stoße auf Probleme, wo ich mich gern mit euch austauschen möchte.
Gesetztes Ziel:
z.B. ein Server wird neu gestartet. Das Script wird rot, das Bild wird geöffnet.
Server ist wieder da, cmd wird wieder schwarz, als Erinnerung, dass da was war, bleibt das Bild geöffnet.
Hier scheitere ich an der Umsetzung.
Ich habe folgendes versucht:
Schlägt der letzte Ping fehl, schreibe ich die IP (%%f) in eine %Error-IP%
Nach
:start
for /f %%f in (ip.list.1) DO (
habe ich eine Abfrage eingebaut:
if %%f EQU %Error-IP% goto 1
:1
ping %%f -n 1 | find "TTL"
if !errorlevel!==0 (
color 0F
set Error-IP=0
echo %%f - %Date% - %Time% - ist wieder erreichbar >>%Log%
echo %%f - %Date% - %Time% - ist wieder erreichbar
) else (
echo %%f - %Date% - %Time% - ping funktioniert noch nicht >>%Log%
echo %%f - %Date% - %Time% - ping funktioniert noch nicht
)
Wohin jetzt mit dem :1?
Zuerst hatte ich es ganz ans Ende, nach dem letzen "goto start" gesetzt. Funktioniert nicht, weil die For-Schleife die IP-Liste nicht weiter abarbeitet, sondern von vorn beginnt.
Danach hab ich :1 vor die letzte schließende Klammer der Schleife gepackt. Ist aber auch nur bedingt erfolgreich, da jetzt das Log überquillt.
Die IP-Liste wird zwar jetzt abgearbeitet aber nur noch über :1
Wie könnte ich das lösen???
Ich bin auf euren Input gespannt!
Ein 2. Problem ist, dass ich das Bild eigendlich nicht über GIMP öffnen möchte. Hier würde ich gerne z.B. das bordeigene "Fotos" verwenden. Da es aber eine Windows-APP ist, ist es keine exe.
Viele Grüße
Tom
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 2746448086
Url: https://administrator.de/contentid/2746448086
Ausgedruckt am: 17.11.2024 um 23:11 Uhr
7 Kommentare
Neuester Kommentar
Moin,
fangen wir mal vorne an:
2. Bild öffnen, wenn Status sich von 0 auf 1 wechselt. Fertig
Gruß
Doskias
fangen wir mal vorne an:
Zitat von @conquestador:
ich versuche, mehr über die Batch-Programmierung zu lernen und habe dazu ein script geschrieben.
Wieso jetzt noch mit Batch anfangen? Nimm lieber gleich PowerShell. Jetzt mit Batch anzufangen ist, wie sich einen Koksofen zum heizen zu kaufen. Es funktioniert, ist aber nicht mehr zeitgemäß.ich versuche, mehr über die Batch-Programmierung zu lernen und habe dazu ein script geschrieben.
goto start
Ernsthaft goto für eine Endlosschleife? Da gibt es auch im Batch schönere MethodenWie könnte ich das lösen???
1. Variable für jedes Gerät deklarieren. 0=nicht erreichbar, 1=erreichbar2. Bild öffnen, wenn Status sich von 0 auf 1 wechselt. Fertig
Ein 2. Problem ist, dass ich das Bild eigendlich nicht über GIMP öffnen möchte. Hier würde ich gerne z.B. das bordeigene "Fotos" verwenden. Da es aber eine Windows-APP ist, ist es keine exe.
Kein Problem mit Powershell Davon abgesehen: Auch Windows-APPs haben eine Exe-Datei, du kommst da nur vermutlich nicht dran, da es geschützte Ordner sind.Gruß
Doskias
Moin,
dieser Eindruck täuscht gewaltig. Batch ist, wenn man es wirklich beherrschen will, deutlich schwieriger zu erlernen als Powershell.
Gruß Thomas
dieser Eindruck täuscht gewaltig. Batch ist, wenn man es wirklich beherrschen will, deutlich schwieriger zu erlernen als Powershell.
Gruß Thomas
Zitat von @conquestador:
@Doskias
Ja, PowerShell ist vermutlich besser. Allerdings finde ich batch für den Anfang leichter. Ich will ja erst mal das Wie und Warum verstehen.
Das wie und warum lernst du mit PowerShell genau so. Der Aufbau von Schleifen und co ist in fast allen Sprachen identisch. Es macht nur keinen Sinn in BATCH über mehrere Zeilen etwas zu programmieren, was Powershell von Haus aus mitbringt.@Doskias
Ja, PowerShell ist vermutlich besser. Allerdings finde ich batch für den Anfang leichter. Ich will ja erst mal das Wie und Warum verstehen.
Zitat von @Doskias:
Das kann schon sein, hilft aber nichts, das als Behauptung in den Raum zu werfen, ohne einen Hinweis darauf, was denn "schöner" wäre.goto start
Ernsthaft goto für eine Endlosschleife? Da gibt es auch im Batch schönere Methodenfor ($i=1; $i -le 10; $i++) {
$i = 1
[Dein Code]
}
Batch macht kaum noch Sinn. Lesen und verstehen schon. Da es immer noch eine Vielzahl davon gibt. Meist reichen aber die Grundlagen.
- Schleife
- GoTo
- Datum/ Uhrzeit auseiandernehmen
- Parameter übergeben
- Variable
Sehe oben, dass du schon einiges davon hast. Batch ist immer noch nicht ganz tot! Darum wirst du es - wenn auch selten - noch irgendwann mal gebrauchen können. Sei es für Migration etc. etc.
PowerShell ist aber unschlagbar. Kein Vergleich. Alles "neue" auf jedenfall damit umsetzen. Sonst läufst du in eine Sackgasse. Wenn du oben schon mal if Block in Batch geschrieben hast, wirst du dich auch rasch in PS zurecht finden.
Was ist es denn? Logik! Du musst verstehen, was du tust und willst. Schleifen gibt es in vielen Sprachen. Egal. wie das Ding aussieht. Es läuft doch immer ähnlich ab......
Dein Vorteil ist: Du hast Bock auf den ### Also schonmal die halb Miete!
- Schleife
- GoTo
- Datum/ Uhrzeit auseiandernehmen
- Parameter übergeben
- Variable
Sehe oben, dass du schon einiges davon hast. Batch ist immer noch nicht ganz tot! Darum wirst du es - wenn auch selten - noch irgendwann mal gebrauchen können. Sei es für Migration etc. etc.
PowerShell ist aber unschlagbar. Kein Vergleich. Alles "neue" auf jedenfall damit umsetzen. Sonst läufst du in eine Sackgasse. Wenn du oben schon mal if Block in Batch geschrieben hast, wirst du dich auch rasch in PS zurecht finden.
Was ist es denn? Logik! Du musst verstehen, was du tust und willst. Schleifen gibt es in vielen Sprachen. Egal. wie das Ding aussieht. Es läuft doch immer ähnlich ab......
Dein Vorteil ist: Du hast Bock auf den ### Also schonmal die halb Miete!