conquestador
Goto Top

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:

@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

Content-ID: 2746448086

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

Ausgedruckt am: 17.11.2024 um 23:11 Uhr

Doskias
Doskias 11.05.2022 um 11:46:26 Uhr
Goto Top
Moin,

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äß.

goto start
Ernsthaft goto für eine Endlosschleife? Da gibt es auch im Batch schönere Methoden

Wie könnte ich das lösen???
1. Variable für jedes Gerät deklarieren. 0=nicht erreichbar, 1=erreichbar
2. 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 face-wink Davon abgesehen: Auch Windows-APPs haben eine Exe-Datei, du kommst da nur vermutlich nicht dran, da es geschützte Ordner sind.

Gruß
Doskias
conquestador
conquestador 11.05.2022 um 11:46:30 Uhr
Goto Top
Hab gerade selber noch einen Denkfehler entdeckt und das "goto start" in den "if !errorlevel!..." rausgenommen.
conquestador
conquestador 11.05.2022 um 12:01:27 Uhr
Goto Top
@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:
goto start
Ernsthaft goto für eine Endlosschleife? Da gibt es auch im Batch schönere Methoden
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.

Wie könnte ich das lösen???
1. Variable für jedes Gerät deklarieren. 0=nicht erreichbar, 1=erreichbar
2. Bild öffnen, wenn Status sich von 0 auf 1 wechselt. Fertig
In diese Richtung hatte ich auch schon gedacht, fand das aber sehr aufwendig und vermutete, dass das einfacher, allgemeiner zu lösen wäre.
TK1987
TK1987 11.05.2022 um 12:12:35 Uhr
Goto Top
Moin,

Zitat von @conquestador:
Allerdings finde ich batch für den Anfang leichter.
dieser Eindruck täuscht gewaltig. Batch ist, wenn man es wirklich beherrschen will, deutlich schwieriger zu erlernen als Powershell.

Gruß Thomas
Doskias
Doskias 11.05.2022 um 12:21:36 Uhr
Goto Top
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.


Zitat von @Doskias:
goto start
Ernsthaft goto für eine Endlosschleife? Da gibt es auch im Batch schönere Methoden
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.
Das was den meisten Leuten versehentlich passiert. Nimm eine While- oder eine For-Schleife und bau da eine Endlosschleifen. Zum Beispiel in PS-Format:
for ($i=1; $i -le 10; $i++) {
$i = 1
[Dein Code]
}
$i wird dabei immer auf 1 gesetzt und wird dadurch nie größer als 10. Folglich wird die Schleife ewig laufen. Hat den schönen Vorteil, dass du mit break jederzeit aus der Schleife ausbrechen kannst, wenn später doch noch was dazwischen kommt und nicht mit Sprungmarken durcheinander kommst.
conquestador
conquestador 11.05.2022 um 13:52:24 Uhr
Goto Top
Ok, dann schau ich mal bei ps um die Ecke face-sad
Crusher79
Crusher79 12.05.2022 um 22:10:18 Uhr
Goto Top
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 ### face-wink Also schonmal die halb Miete!