Fragen rund um Bat-Befehle
Ja, ja ich bins wieder einmal der "ForenDurchForster"!
Möchte das meine Batch-Datei den Bat-Vorgang nur durchführt wenn der PC in einem bestimmten Netz ist. zB durch pingen eines proxy
Wie kann ich das machen, dass die Batch-Datei dauernt (vom Start des Computers an) nach dem Proxy sucht und nur wenn sie Ihn findet den Vorgang durchführt und falls sie den Vorgang durchgeführt hat und der Proxy wieder verschwindet (nicht mehr Vorhanden ist) das dann ein andere Befehl durchgeführt wird?
Ist das möglich und frist das eh nicht zuviele von der Rechenpower?
THX, for all answers!
JK
Möchte das meine Batch-Datei den Bat-Vorgang nur durchführt wenn der PC in einem bestimmten Netz ist. zB durch pingen eines proxy
Wie kann ich das machen, dass die Batch-Datei dauernt (vom Start des Computers an) nach dem Proxy sucht und nur wenn sie Ihn findet den Vorgang durchführt und falls sie den Vorgang durchgeführt hat und der Proxy wieder verschwindet (nicht mehr Vorhanden ist) das dann ein andere Befehl durchgeführt wird?
Ist das möglich und frist das eh nicht zuviele von der Rechenpower?
THX, for all answers!
JK
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 16577
Url: https://administrator.de/forum/fragen-rund-um-bat-befehle-16577.html
Ausgedruckt am: 23.12.2024 um 13:12 Uhr
20 Kommentare
Neuester Kommentar
Hallo,
du könntest über den Zeitplandienst deine Batch-Datei regelmäßig starten lassen. Diese Batchdatei sendet dann einen Ping an eine bestimmte IP-Adresse und schreibt das Ergebniss in eine Textdatei.
Mittels einer For-Schleife kannst du nun diese Textdatei analysieren und gucken, ob dein Ping erfolgreich war und dann den entsprechenden Befehl ausführen lassen.
> Beispiel <------
ping xxx.xxx.xxx.xxx >iplog.txt
for /F "skip=3 tokens=1,2,3,4" %%a in (iplog.txt) do set iptest=%%d
If not %iptest%==Zielnetz goto yes
goto no
:yes
net send %username% erfolgreich!
goto ende
:no
net send %username% erfolglos!
goto ende
:ende
> Beispiel Ende <------
Gruß
Michael
du könntest über den Zeitplandienst deine Batch-Datei regelmäßig starten lassen. Diese Batchdatei sendet dann einen Ping an eine bestimmte IP-Adresse und schreibt das Ergebniss in eine Textdatei.
Mittels einer For-Schleife kannst du nun diese Textdatei analysieren und gucken, ob dein Ping erfolgreich war und dann den entsprechenden Befehl ausführen lassen.
> Beispiel <------
ping xxx.xxx.xxx.xxx >iplog.txt
for /F "skip=3 tokens=1,2,3,4" %%a in (iplog.txt) do set iptest=%%d
If not %iptest%==Zielnetz goto yes
goto no
:yes
net send %username% erfolgreich!
goto ende
:no
net send %username% erfolglos!
goto ende
:ende
> Beispiel Ende <------
Gruß
Michael
Hallo,
genau dies macht das von mir als Beispiel angegebene Script. Es sendet einen Ping an eine bestimmte IP-Adresse und schreibt das Ergebniss des Ping's in eine Datei mit dem Namen iplog.txt.
Dann läuft eine for-Schleife über die so erstellte Datei drüber und schreibt den 4. Wert einer jeden Zeile in eine Variable mit dem Namen iptest. Da der Wert bei Erfolg und Mißerfolg des Ping's unterscheidet, wird die Variable jetzt mit dem Wert verglichen, der bei einem erfolglosen Ping zurückgegeben worden wäre.
Stimmen die beiden Werte nicht überein, geht das Script zur Sprungmarke yes für einen erfolgreichen Ping, andernfalls zu no für nicht erfolgreich.
Es werden dann die unter der jeweiligen Sprungmarke angegebenen Befehle ausgeführt.
Das ganze habe ich unter NT 4.0 erstellt, sollte mit kleinen Änderungen aber auch auf 2k und XP laufen. Du musst dir nur die Ausgaben, die vom Script in die Variable iptest geschrieben werden, ansehen und das Script dann insoweit abändern.
Gruß
Michael
genau dies macht das von mir als Beispiel angegebene Script. Es sendet einen Ping an eine bestimmte IP-Adresse und schreibt das Ergebniss des Ping's in eine Datei mit dem Namen iplog.txt.
Dann läuft eine for-Schleife über die so erstellte Datei drüber und schreibt den 4. Wert einer jeden Zeile in eine Variable mit dem Namen iptest. Da der Wert bei Erfolg und Mißerfolg des Ping's unterscheidet, wird die Variable jetzt mit dem Wert verglichen, der bei einem erfolglosen Ping zurückgegeben worden wäre.
Stimmen die beiden Werte nicht überein, geht das Script zur Sprungmarke yes für einen erfolgreichen Ping, andernfalls zu no für nicht erfolgreich.
Es werden dann die unter der jeweiligen Sprungmarke angegebenen Befehle ausgeführt.
Das ganze habe ich unter NT 4.0 erstellt, sollte mit kleinen Änderungen aber auch auf 2k und XP laufen. Du musst dir nur die Ausgaben, die vom Script in die Variable iptest geschrieben werden, ansehen und das Script dann insoweit abändern.
Gruß
Michael
Moin JK87,
ich würde es an dieser Stelle nicht so kompliziert machen.
In Lord_Helmi's Beispielbatch eine Zeile vorschalten:
bzw.
Wenn Du lieber diesen FOR-Befehl oben verwenden möchtest, dann reicht trotzdem ein einmaliges "Ping" (also Parameter n 1).
Und die überzähligen Zeilen entsorgst Du eben mit dem Find-Befehl (s.o.).
Aber tun sollte es auch die Zeile von mir... Du willst ja von dem Proxy nur wissen, ob er erreichbar ist und nicht seine Lebensgeschichte und sein Sternzeichen.
Frank / der Biber aus Bremen
[Edit]Die For-Zeile stimmt nur sinngemäß, siehe Berichtigung unten.[/Edit]
ich würde es an dieser Stelle nicht so kompliziert machen.
In Lord_Helmi's Beispielbatch eine Zeile vorschalten:
Wenn Du lieber diesen FOR-Befehl oben verwenden möchtest, dann reicht trotzdem ein einmaliges "Ping" (also Parameter n 1).
Und die überzähligen Zeilen entsorgst Du eben mit dem Find-Befehl (s.o.).
Aber tun sollte es auch die Zeile von mir... Du willst ja von dem Proxy nur wissen, ob er erreichbar ist und nicht seine Lebensgeschichte und sein Sternzeichen.
Frank / der Biber aus Bremen
[Edit]Die For-Zeile stimmt nur sinngemäß, siehe Berichtigung unten.[/Edit]
Moin JK87,
sorry, gestern abend hat Werder gespielt, da hab ich wohl ein paar Klammern falsch gesetzt, weil ich mit den Gedanken woanders war.
Als ich eben grad noch einen Blick auf den Unsinn von gestern geworfen hatte, musste ich selber lachen.
Also, zur Richtigstellung:
Folgende Anweisung belegt nur unnötigerweise kostbaren Plattenplatz:
(läuft immer in die "do (goto yes)"-Anweisung; der ODER-Fall kann nie erreicht werden)
Ist natürlich Schwachsinn, so wie die Klammern gesetzt sind. Bitte nie in einem Multiple-Choice-Test an der VHS so was ankreuzen.
Richtiger:
(Wenn im Ping-Output "Antwort" gefunden wird, dann ist er Online, wenn nicht "goto no")
*Peinlich, sowas...
..und jetzt schreib ich mir erst mal einen Batch, der 100x schreibt:
Ich werde keine ungetesteten Oneliner mehr posten!
Ich werde keine ungetesteten Oneliner mehr posten!
Ich werde keine ungetesteten Oneliner....
Biber
sorry, gestern abend hat Werder gespielt, da hab ich wohl ein paar Klammern falsch gesetzt, weil ich mit den Gedanken woanders war.
Als ich eben grad noch einen Blick auf den Unsinn von gestern geworfen hatte, musste ich selber lachen.
Also, zur Richtigstellung:
Folgende Anweisung belegt nur unnötigerweise kostbaren Plattenplatz:
Ist natürlich Schwachsinn, so wie die Klammern gesetzt sind. Bitte nie in einem Multiple-Choice-Test an der VHS so was ankreuzen.
Richtiger:
*Peinlich, sowas...
..und jetzt schreib ich mir erst mal einen Batch, der 100x schreibt:
Ich werde keine ungetesteten Oneliner mehr posten!
Ich werde keine ungetesteten Oneliner mehr posten!
Ich werde keine ungetesteten Oneliner....
Biber
nAbend JK87,
so viele Fragen...
> Wie kann ich mehrere Befehle bei yes/no ausführen lassen...
Indem Du sie untereinander in "Blöcken" gruppierst. Siehe unten.
>.... und falls einer nicht funktioniert, dass dieser einfach übersprungen wird?
Ist ein Widerspruch. Geht nur eins von beiden *gg
Ich vermute, Du meinst, wenn ein Fehler auftritt, willst Du nicht, dass er auf den Bildschirm durchschlägt?
Falls Du das meinst: Alle Ausgaben und Fehlermeldungen ins Nirwana lenken ( ">nul" )
und selber prüfen, ob alles ok ist (Errorlevel ist 0, d.h. ein &&-UND-Befehl wird ausgeführt ) oder
Beispiel auch unten beim Ping.
>Kann man den Proxy in einer INI-Datei angeben (Proxy=10.10.0.1) welcher von dort dann zum pingen importiert wird?
Ja. Schmucklose Variante:
In einer Textdatei genau EINE Zeile nur mit der IP.
Im Batch diesen Inhalt in eine Variable namens MeineIP lesen...
Bisschen schönere Variante einer Ini-Datei c:\config\meineIPs.ini
---Inhalt--
[AlleIPs]
StandardIP=10.10.0.1
ErsatzIP=10.10.80.3
SchmuddelIP=0.190.666.666
...
Ende c:\config\meineIPs.ini
Lesen der Variablen im Batch (bei Bedarf):
HTH & HANN
Biber
[Edit] Die Zeile "Set /p MeineIP=.." hat hat es natürlich zerrissen.. HTML-Tags..
jetzt ist der Rest der Zeile sichtbar. Sorry. [/Edit]
so viele Fragen...
> Wie kann ich mehrere Befehle bei yes/no ausführen lassen...
Indem Du sie untereinander in "Blöcken" gruppierst. Siehe unten.
>.... und falls einer nicht funktioniert, dass dieser einfach übersprungen wird?
Ist ein Widerspruch. Geht nur eins von beiden *gg
Ich vermute, Du meinst, wenn ein Fehler auftritt, willst Du nicht, dass er auf den Bildschirm durchschlägt?
Falls Du das meinst: Alle Ausgaben und Fehlermeldungen ins Nirwana lenken ( ">nul" )
und selber prüfen, ob alles ok ist (Errorlevel ist 0, d.h. ein &&-UND-Befehl wird ausgeführt ) oder
>Kann man den Proxy in einer INI-Datei angeben (Proxy=10.10.0.1) welcher von dort dann zum pingen importiert wird?
Ja. Schmucklose Variante:
In einer Textdatei genau EINE Zeile nur mit der IP.
---Beispiel Inhalt c:\meineconfig\MyIP.txt
10.10.0.1
---ende Inhalt c:\config\MyIP.txt
Im Batch diesen Inhalt in eine Variable namens MeineIP lesen...
--- Beispielbätch1.Bat
...
Set /p MeineIP=<c:\config\MyIP.txt
...
(Ping -n 1 %meineIP% | find "Antwort" >nul) || goto MeineIPOffline
::wenn der batch hier ankommt, war kein Fehler.. also Online
:MeineIPOnline
...(AnweisungAWennOnline )
...(AnweisungBWennOnline )
...(AnweisungCWennOnline)
::---- Ende Block MeineIPOnline
goto ganzweitunten
:MeineIPOffline
Echo IP %MeineIP% ist nicht erreichbar!
...(Fehlerbehandlung)...
...
::---Ende Block MeineIPOffline
goto ganzweitunten
....
... (Jahre später...)
...
:ganzweitunten
...(Aufräumarbeiten, z.B. Variablen oder Tmp-Dateien löschen)
Set MeineIP=
....
::EndOfTheWorld
::-------ende BeispielBätch1.bat
Bisschen schönere Variante einer Ini-Datei c:\config\meineIPs.ini
---Inhalt--
[AlleIPs]
StandardIP=10.10.0.1
ErsatzIP=10.10.80.3
SchmuddelIP=0.190.666.666
...
Ende c:\config\meineIPs.ini
Lesen der Variablen im Batch (bei Bedarf):
---- beispielbatch2.bat
...
...
Set meineIP=0.0.0.0
call :IpTest StandardIP
if Errorlevel 1 call :IpTest ZweitIP
if Errorlevel 1 call :IpTest DrittIP
if Errorlevel 1 call :IpTest SchmuddelIP
if errorlevel 1 goto HatKeinZweck
:: ... die Vorzeile tritt in Aktion, wenn alles scheitert.
:: Sonst kannst Du in der nächsten Zeile weiterbätcheln
echo Verwende jetzt IP %meineIP%, denn die funktioniert!
...
... (weitere Aktionen)
...
goto :eof
...
...
:IpTest
(type meineips.ini|find /i "%1" >nul) || goto :eof
::die Vorzeile läuft auf Fehler und RETURNt, wenn kein Wert %1 (z.B. StandardIP, in der *ini-Datei steht
for /f "tokens=1,2 delims==" %%i in ('type meineips.ini^|find /i "%1"') do Set MeineIP=%%j
Ping -n 1 %meineIP% | find "Antwort" >nul
:: jetzt ist Errorlevel=0, wenn ping Erfolg hatte, sonst <>0. Auswertung oben
goto :eof
-------- ende beispielbatch2.bat
HTH & HANN
Biber
[Edit] Die Zeile "Set /p MeineIP=.." hat hat es natürlich zerrissen.. HTML-Tags..
jetzt ist der Rest der Zeile sichtbar. Sorry. [/Edit]
@JK87
Siehe oben... der Import ist nicht das Problem. Aber Du willst ja vermutlich diesen Proxy dann auch per CMD-Zeile aktivieren? Spätestens dafür mach bitte einen neuen Thread auf
Wie geschrieben.. im Batch (oder jedem anderen Codefetzen) bestimmst Du, ob bei Fehler abgebrochen wird, ob Du den Benutzer mit Fehlermeldungen belästigst oder selbst eine Fehlerbehandlung/einen Alternativweg wählst.
Einige Progrämmchen, die ich zusammengeschrotet habe, bestehen sicherlich zu 40% aus Fehlerbehandlungen... und diese Größenordnung wird es immer, wenn Du selbst im Programm alle Eventualfälle abdecken willst. Einfacher wird es nur, wenn Du den armen Endbenutzer immer ganz dreist fragst, was das Programm jetzt (bei Fehler) tun soll.
So wie M$ es gerne macht. Dann kannst Du im Zweifelsfall immer den Anwender zusammenfalten, wenn etwas in die Grütze geht ("Du hättest doch da nicht OK drücken dürfen, sondern Abbrechen! Nun ist alles kaputt wegen Dir..")
Ist es nicht möglich, dass Daten von einer INI-Datei in eine Batchdatei
importiert werden kann (zB Proxy=10.10.0.1, Port=8080, import nur immer der Werte)?
importiert werden kann (zB Proxy=10.10.0.1, Port=8080, import nur immer der Werte)?
Siehe oben... der Import ist nicht das Problem. Aber Du willst ja vermutlich diesen Proxy dann auch per CMD-Zeile aktivieren? Spätestens dafür mach bitte einen neuen Thread auf
>.... und falls einer nicht funktioniert, dass dieser einfach übersprungen wird?
Meinte ich so, dass nicht abgebrochen wird wenn ein befehl nicht funktioniert oder eine
Datei nicht gefunden wurde!
Meinte ich so, dass nicht abgebrochen wird wenn ein befehl nicht funktioniert oder eine
Datei nicht gefunden wurde!
Wie geschrieben.. im Batch (oder jedem anderen Codefetzen) bestimmst Du, ob bei Fehler abgebrochen wird, ob Du den Benutzer mit Fehlermeldungen belästigst oder selbst eine Fehlerbehandlung/einen Alternativweg wählst.
Einige Progrämmchen, die ich zusammengeschrotet habe, bestehen sicherlich zu 40% aus Fehlerbehandlungen... und diese Größenordnung wird es immer, wenn Du selbst im Programm alle Eventualfälle abdecken willst. Einfacher wird es nur, wenn Du den armen Endbenutzer immer ganz dreist fragst, was das Programm jetzt (bei Fehler) tun soll.
So wie M$ es gerne macht. Dann kannst Du im Zweifelsfall immer den Anwender zusammenfalten, wenn etwas in die Grütze geht ("Du hättest doch da nicht OK drücken dürfen, sondern Abbrechen! Nun ist alles kaputt wegen Dir..")