vanitas
Goto Top

Per Batch aus einer textdatei ip addresse in cmd befehl kopieren

Hallo an Alle ..
Bin neu dazugestoßen und finde euer board richtig gut vorallem von den Lösungstipps / Lösungen.

Mein Frage / Problem:

Ich möchte aus einer vorhandenen Textdatei (das foolgendermaßen in etwa aussieht) :

blaaaaaa 192.168.1.1 blaaaaaaa
blaaaaaa 192.168.34.5 blaaaaaa
blaaaaaa 192.168.22.1 blaaaaaa

hier soll nun mit Hilfe einer .bat als erstes für die IP in der ersten Zeile eine Variabel gesetzt werden,
dann für die 2. und dann für die 3. (wenn das nicht funktioniert mit den Zeilen dann könnte er auch
automatisch die zeile löschen deren ip er schon kopiert hat)
Wenn er keine IP mehr findet soll er die IP aus der ersten Zeile in einen CMD Befehl kopieren

z.B.

ping IP 1
ping IP 2
ping IP 3

das ergebnis soll er dann in eine andere text datei speichern

und noch ein Frage ist es möglich in eine batch datei eine zeitliche verzögerung bis zum nächten befehl einzubauen
in etwa 1 min. oder sowas?


mfg Vanitas

Content-Key: 79449

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

Printed on: April 24, 2024 at 09:04 o'clock

Member: bastla
bastla Jan 29, 2008 at 15:49:47 (UTC)
Goto Top
Hallo vanitas und willkommen im Forum!

Was Dir vorschwebt ist zwar auch machbar, aber in Batch wäre der Ablauf einfacher so:

Lies IP aus erster Zeile, führe Befehl für IP aus, Pause,
lies IP aus nächster Zeile, führe Befehl für IP aus, Pause,
...
@echo off & setlocal
set "IPListe=D:\DeineTextDatei.txt"  
set "Ergebnis=D:\Pings.txt"  

if exist "%Ergebnis%" del "%Ergebnis%"  
for /f "usebackq tokens=2" %%i in ("%IPListe%") do call :ProcessIP %%i  
goto :eof

:ProcessIP
ping %1 >>"%Ergebnis%"  
ping -n 60 localhost>nul
Das Auslesen funktioniert mit dem obigen Code nur, wenn in Deiner Datei tatsächlich das erste Leerzeichen in der Zeile unmittelbar vor und das zweite Leerzeichen unmittelbar nach der IP-Adresse steht - anderenfalls müsstest Du angeben, wo sich die IP-Adresse in der Zeile befindet (Position) / nach welchem Kriterium sie zu finden ist.

das ergebnis soll er dann in eine andere text datei speichern
"Ergebnis" wäre noch näher zu definieren - vermutlich meinst Du damit "erreichbar" oder "nicht erreichbar", wofür sich etwa folgende "ping"-Zeile ergäbe:
ping %1|findstr /c:"(100% Verlust)">nul && (echo %1 - offline>>"%Ergebnis%") || echo %1 - online>>"%Ergebnis%"  
Zusätzliche Parameter (zB "-n" oder "-w") für den "ping" kannst Du ja noch ergänzen ...
Eine Pause lässt sich, wie im Beispiel oben gezeigt, ebenfalls durch einen "ping" realisieren - alternativ dazu gibt es etwa "sleep.exe" oder andere externe Tools.


Grüße
bastla
Member: vanitas
vanitas Jan 29, 2008 at 16:36:08 (UTC)
Goto Top
ok danke erstmal für deine Hilfe
hatte nicht gedacht das das so komplex ist
die .txt datei war nur ein Beispiel, dachte du könntest die IP Adresse evtl. über *.*.*.* suchen oder so..
wenn das nicht ginge dann ist die textdatei folgendermaßen aufgebaut:
192.168.2.44:
192.168.3.22:
192.168.23.21:

das bedeutet die IP steht am Anfang der Zeile und ist mit einem Doppelpunkt von dem rest der zeile getrennt..
der befehl "ping" war eigentlich auch nur ein beispiel
gibt es da eine Möglichkeit das er der gefundenen IP eine Variabel zuweist, die ich dann im CMD Befehl nur an die nötige stelle setzen muss? zb.

"der Suchvorgang nach den verschiedenen IPs"
programm.exe IP Adresse1 >>"%Ergebnis%"
programm.exe IP Adresse2 >>"%Ergebnis%"


Danke und mit freundlichen Gruß!
Member: bastla
bastla Jan 29, 2008 at 16:53:03 (UTC)
Goto Top
Hallo vanitas!

... der gefundenen IP eine Variabel zuweist, die ich dann im CMD Befehl nur an die nötige stelle setzen muss?
Diese Variable ist "%1" im Unterprogramm ":ProcessIP" - zusammen mit der geänderten Textdatei sähe das so aus:
@echo off & setlocal
set "IPListe=D:\DeineTextDatei.txt"  
set "Ergebnis=D:\Pings.txt"  

if exist "%Ergebnis%" del "%Ergebnis%"  
for /f "usebackq delims=:" %%i in ("%IPListe%") do call :ProcessIP %%i  
goto :eof

:ProcessIP
programm.exe %1 >>"%Ergebnis%"  
ping -n 60 localhost>nul
Soferne Du die Ergebnisdatei mit der Zeile "der Suchvorgang nach den verschiedenen IPs" beginnen willst, könntest Du die "if exist ..."-Zeile durch folgende ersetzen:
echo der Suchvorgang nach den verschiedenen IPs>"%Ergebnis%"  
Durch die Verwendung eines einzelnen ">" wird eine ev schon bestehende Datei überschrieben (mit ">>" wird die Zeile am Ende der Datei angefügt).

Grüße
bastla
Member: vanitas
vanitas Jan 29, 2008 at 17:21:27 (UTC)
Goto Top
sehr schön ..
noch eine frage ..
ist das nun nur ein Vorgang für die 1. Zeile und damit für die erste IP oder wiederholt er automatisch diesen Vorgang bis er keine IP mehr findet und führt dann die Befehle aus?
dann müsste er ja eigentlich verschieden Variablen haben oder?

Die batch soll automatisch solange nach IPs suchen bis er keine mehr finden kann und dann die befehle ausführen oder macht er das in deiner version zwischendrin?
Member: bastla
bastla Jan 29, 2008 at 17:25:17 (UTC)
Goto Top
Hallo vanitas!

Wie schon oben beschrieben, wird sofort nach dem Auslsesen die IP (im Unterprogramm) verarbeitet (also "zwischendrin" face-wink). Gelesen werden alle Zeilen der Textdatei, wobei vorausgesetzt wird, dass auch jede Zeile mit einer IP beginnt.

Grüße
bastla
Member: vanitas
vanitas Jan 29, 2008 at 20:05:42 (UTC)
Goto Top
noch eine letzte frage (=

wenn er jetzt in dem .txt file keine IP findet ... dann funktioniert das ganze ja nicht das bedeutet er erstellt kein "Ergebnis" und führt auch die befehle dannach nicht mehr aus...

wie kann man das umgehen?
bzw. kann man ihm sagen das er dann einfach den nächsten befehl ausführen soll?

danke dir!
Member: bastla
bastla Jan 29, 2008 at 20:21:30 (UTC)
Goto Top
Hallo vanitas!

wenn er jetzt in dem .txt file keine IP findet
Dem würde ich vorbeugen, indem dann gar keine Textdatei vorhanden wäre, was sich mit einem
if not exist "%IPListe%" goto :Weiter  
if exist "%Ergebnis%" del "%Ergebnis%"  
for /f "usebackq delims=:" %%i in ("%IPListe%") do call :ProcessIP %%i  
:Weiter
:: hier weitere Befehle
::
:: und jetzt ist Ende
goto :eof

:ProcessIP
programm.exe %1 >>"%Ergebnis%"  
ping -n 60 localhost>nul
Soferne allerdings die Textdatei doch vorhanden, aber leer ist, wird einfach das Unterprogramm durch die "for"-Schleife nicht aufgerufen - was zum gleichen Ergebnis führt.

Nicht erkennen kann der Batch in dieser Version, wenn die Textdatei zwar irgendwelchen Text, aber keine IP-Adresse enthält - es wird stur der erste Teil einer Zeile bis zum ":" oder, wenn es keinen ":" gibt, die gesamte Zeile, als IP interpretiert.

kann man ihm sagen das er dann einfach den nächsten befehl ausführen soll?
Musst Du nicht - der wird nach der "for"-Schleife ohnehin ausgeführt ...

Grüße
bastla
Member: vanitas
vanitas Jan 30, 2008 at 17:42:16 (UTC)
Goto Top
hm danke dir !!

noch ne kleine Frage ..

wie kann ich eine unendlos schleife einbauen so das sich die bat immer wieder von alleine startet ..
ohne das sich das irgendwann aufhängt und abbricht.

gibs irgendwelche optionen die ich in den code, ohne die option, das die ipliste leer is einbauen könnte damit er wenn er evtl. mal n fehler macht einfach diesen umgeht und neustartet die bat?

mfg
Member: Biber
Biber Jan 30, 2008 at 18:16:48 (UTC)
Goto Top
wie kann ich eine unendlos schleife einbauen ...
Das sprengt mein räumliches Vorstellungsvermögen....
so das sich die bat immer wieder von alleine startet ..
Google mal nach "perpetuum bätchele"
ohne das sich das irgendwann aufhängt und abbricht.
Dann wechsele auf ein Unix-System...

  • Du kannst überall dort, wo der Batch aufhört oder ein "goto :eof" außerhalb einer Unterroutine steht, ein "goto :start" einfügen.
Und in die erste Zeile nach "@echo off & setlocal" und den Kommentarzeilen diese Sprungmarke reinklimpern..
:start

Aber for WTF werden denn heute noch Batches nachgefragt, die 365x7x24 laufen und rumpingen??

Grüße
Biber