Batch 2x ping in txt speichern mit einem Aufruf

o0Julia0o

Commander
Registriert
Dez. 2012
Beiträge
2.738
hi,

ich möchte diese 2 ping-Befehle parallel ausführen. So habe ich das probiert:

start ping 192.168.1.1 -t > Router.txt
start ping 8.8.8.8 -t > Google.txt

...doch das funktioniert nicht, da dann nicht in die Textdatei geschrieben wird.

so klappt es nicht, da dann der 1. Befehl nur ausgeführt wird.
ping 192.168.1.1 -t > Router.txt
ping 8.8.8.8 -t > Google.txt
 
Zuletzt bearbeitet:
Warum start davor?
 
  • Gefällt mir
Reaktionen: o0Julia0o
Damit der zum nächsten Befehl springt, in die nächste Zeile. So geht es auch nicht:
ping 192.168.1.1 -t > Router.txt & ping 8.8.8.8 -t > Google.txt

auch hier wird nur der 1. Befehl ausgeführt.

Genauso wie mit:
call ping 192.168.1.1 -t > Router.txt
call ping 8.8.8.8 -t > Google.txt
 
Zuletzt bearbeitet:
o0Julia0o schrieb:
auch hier wird nur der 1. Befehl ausgeführt.
Ist eine Limitierung von CMD. Da kann nur ein Prozess laufen, parallel geht nur mit 2 getrennten CMDs.
 
Tatsaechlich sollte "start" ohne /wait parallel starten...

Da gabs mal einen Bug, glaub ich...

versuch mal start "Titel" Befehl:
start "ping1" ping 192.168.1.1 -t > Router.txt
start "ping2" ping 8.8.8.8 -t > Google.txt
 
Mit start und Namen - kann leer gelassen werden werden zwar beide pings aufgerufen, jedoch nicht in eine Textdatei geschrieben (also das gleiche Ergebnis wie ohne die Anführungszeichen):
start "" ping 192.168.1.1 -t > Router.txt
start "" ping 8.8.8.8 -t > Google.txt
 
oiisamiio schrieb:
Tatsaechlich sollte "start" ohne /wait parallel starten...
Nur wenn du externe Programme oder CMD-Windows startest.

Z.B:
Code:
start "" cmd /c ping 192.168.1.1 -t > Router.txt
start "" cmd /c ping 8.8.8.8 -t > Google.txt

Das startet 2 CMD-Fenster, und schließt diese bei Beendigung des Tasks.
 
  • Gefällt mir
Reaktionen: o0Julia0o
Mit Powershell (ab 7, da vorher -Parallel bei foreach-object noch nicht unterstützt wird):
PowerShell:
$hosts = '192.168.1.1','8.8.8.8'
$hosts | ForEach-Object -Parallel { ping $_ > c:\temp\$_.txt}
 
  • Gefällt mir
Reaktionen: Art Vandelay, o0Julia0o und mae1cum77
Denke auch, dass hier Powershell eventuell die bessere Wahl ist...
 
  • Gefällt mir
Reaktionen: o0Julia0o
mae1cum77 schrieb:
Nur wenn du externe Programme oder CMD-Windows startest.

Z.B:
Code:
start "" cmd /c ping 192.168.1.1 -t > Router.txt
start "" cmd /c ping 8.8.8.8 -t > Google.txt

Das startet 2 CMD-Fenster, und schließt diese bei Beendigung des Tasks.
Genau. Das ist nur nicht der Befehl den ich ausgeführt haben möchte. Das wäre dieser hier:
ping 192.168.1.1 -t > Router.txt

Der Ping soll also in die Router.txt geschrieben werden.
 
2 Dinge:

1)
Bitte das command ebenfalls in "" setzen, also "ping ... > ..."

2)
Darüber hinaus solltest du auch noch ein 2>&1 an den Ping anhängen, weil ping auch Ausgaben auf stderr macht und ein alleiniges > bzw >> lediglich stdout umleitet. 1 ist stdout und wird implizit genutzt. Hier sind die normalen Ausgaben einer Anwendung drin. 2 ist stderr und enthält etwaige Fehlermeldungen. Mit 2>&1 leitet man stderr (2) in stdout (1) um und sieht am Ende in der Datei sowohl die erfolgreichen Meldungen wie auch die Fehler.



Zusatz: Ich bin gerade nur am Tablet und kann es nicht ausprobieren, aber es kann sein, dass du jedes > escapen musst, weil es als Text übergeben wird und kein Bestandteil eines richtigen Kommandos ist.
Also ^> bzw ^>^>
 
  • Gefällt mir
Reaktionen: o0Julia0o und mae1cum77
Code:
ping 192.168.1.1 >>Router.txt  & ping 8.8.8.8 >>Google.txt
wird dann Parallel ausgeführt und nicht hintereinander
 
  • Gefällt mir
Reaktionen: o0Julia0o
Sylar schrieb:
wird dann Parallel ausgeführt
Funktioniert mit dem -t Switch nur für den ersten Befehl. Wie, wenn es untereinander gesetzt wird.
Ergänzung ()

mae1cum77 schrieb:
Code:
start "" cmd /c "ping 192.168.1.1 -t 2>&1" ^>^>Router.txt
start "" cmd /c "ping 8.8.8.8 -t 2>&1" ^>^>Google.txt
Da laufen beide mit Schreibprozess parallel für 'unendliches' logging.
 
  • Gefällt mir
Reaktionen: Raijin, Sylar und o0Julia0o
Bitte für sowas entweder kein Batch verwenden oder "besser aufpassen"! :daumen:

Nicht mal nur wegen Parallelität. Das ginge noch. Nein, hier schreiben zwei gleichzeitige Prozesse in eine Ausgabedatei. Schlecht!

Powershell würde foreach mit Option -Parallel kennen sowie Jobs unterstützen, und viel wichtiger, könnte das Ergebnis in einer in diesem Sinne threadlokalen Variable halten, die man dann gemeinsam als Objektdatum in eine Ausgabedatei packt. Sollte marginal performanter sein, da file i/o sehr teuer ist, Aber natürlich bei nur zwei Dateien nicht so den Unterschied macht.
Powershell hat außerdem Test-Connection als native Implementierung von Ping. Allerdings läuft die Fehlerbehandlung anders als in batch (Exception statt error level, allerdings kann man mit -Quiet auch einfach einen booleschen Status haben (antwortet/antwortet nicht).

In Batch wäre stattdessen jeder Ping in seine eigene Datei zu protokollieren und diese dann in eine Gemeinsame Ausgabedatei zu kopieren, entweder mit type "datei1" "datei2" > "Ergebnis" oder mit copy "datei1"+"datei2" "Ergebnis" .
 
  • Gefällt mir
Reaktionen: o0Julia0o
Iqra schrieb:
Nicht mal nur wegen Parallelität. Das ginge noch. Nein, hier schreiben zwei gleichzeitige Prozesse in eine Ausgabedatei. Schlecht!
Im Beispiel über dir werden 2 CMD-Fenster geöffnet und schreiben in 2 TXT Dateien. Ist genauso gewünscht.

Ist nicht schön, aber manche bevorzugen eine simple Lösung, du kannst der TE gern die Grundlagen von Powershell näherbringen, sie könnte aber durchaus überfordert sein :).
 
  • Gefällt mir
Reaktionen: o0Julia0o und Iqra
Okay, dann hab ich das in den Antworten übersehen. Ist halt Montag. ;) Sorry.
 
  • Gefällt mir
Reaktionen: o0Julia0o und mae1cum77
Zurück
Oben