Mehrere Fragen zu Batch
Hallo, liebe Community
Ich beschäftige mich nun schon etwas länger mit Batch, aber folgende Fragen sind offen geblieben:
- Ich kann eine Datei entweder mit ">" überschreiben oder mit ">>" ans Ende der Datei schreiben. Wie aber kann ich an den Anfang der Datei schreiben, oder gar etwas an das Ende oder den Anfang einer Xten Zeile? Ist das irgentwie realisierbar?
- Gibt es eine Möglichkeit die Registry mit einem Wildcat nach Einträgen zu durchsuchen?
- Warum kommt es öfters vor, dass sich ein Batch-Fenster nicht von alleine schließt? Das passiert besonders häufig, wenn es von einer anderen Datei gestartet wurde. Auch ein "Exit" oder "del %0" an das Ende dieser Datei bringt nichts.
- Wenn es in meinem Programm einen Syntaxfehler gibt, wie kann ich erreichen, dass das Programm trotzdem weiter ausgeführt wird und die Zeile nur übersprungen wird? (Beispiel: "goto irgendwo" obwohl es das Label :irgendwo gar nicht gibt)
- Wie kann ich ALLE Ausgaben generell umleiten, ohne dies hinter jeden Befehl schreiben zu müssen? Ich lese immer wieder etwas von CTTY, aber das funktioniert nicht und der Befehl taucht auch nicht in der offiziellen Windows Befehlszeilenreferenz auf.
- Kann ich eine Ausgabe mehrmals umleiten, z.B. so, dass dem Benutzer die Ausgabe angezeigt wird, sie aber gleichzeitig AUCH in einen Logdatei umgeleitet wird?
So ;) ich hoffe das reicht erstmal.
Würde mich echt sehr freuen, wenn doch das ein oder andere Problem gelöst werden könnte.
Ich beschäftige mich nun schon etwas länger mit Batch, aber folgende Fragen sind offen geblieben:
- Ich kann eine Datei entweder mit ">" überschreiben oder mit ">>" ans Ende der Datei schreiben. Wie aber kann ich an den Anfang der Datei schreiben, oder gar etwas an das Ende oder den Anfang einer Xten Zeile? Ist das irgentwie realisierbar?
- Gibt es eine Möglichkeit die Registry mit einem Wildcat nach Einträgen zu durchsuchen?
- Warum kommt es öfters vor, dass sich ein Batch-Fenster nicht von alleine schließt? Das passiert besonders häufig, wenn es von einer anderen Datei gestartet wurde. Auch ein "Exit" oder "del %0" an das Ende dieser Datei bringt nichts.
- Wenn es in meinem Programm einen Syntaxfehler gibt, wie kann ich erreichen, dass das Programm trotzdem weiter ausgeführt wird und die Zeile nur übersprungen wird? (Beispiel: "goto irgendwo" obwohl es das Label :irgendwo gar nicht gibt)
- Wie kann ich ALLE Ausgaben generell umleiten, ohne dies hinter jeden Befehl schreiben zu müssen? Ich lese immer wieder etwas von CTTY, aber das funktioniert nicht und der Befehl taucht auch nicht in der offiziellen Windows Befehlszeilenreferenz auf.
- Kann ich eine Ausgabe mehrmals umleiten, z.B. so, dass dem Benutzer die Ausgabe angezeigt wird, sie aber gleichzeitig AUCH in einen Logdatei umgeleitet wird?
So ;) ich hoffe das reicht erstmal.
Würde mich echt sehr freuen, wenn doch das ein oder andere Problem gelöst werden könnte.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 52875
Url: https://administrator.de/forum/mehrere-fragen-zu-batch-52875.html
Ausgedruckt am: 08.05.2025 um 17:05 Uhr
6 Kommentare
Neuester Kommentar
Moin Geplagter,
willkommen im Forum.
Statt "echo Neue Zeile >>VorhandeneDatei.txt" jetzt
echo NeueZeile >neu.txt
copy neu.txt+VorhandeneDatei.txt
> in Neu.txt steht jetzt alles beginnend mit "Neue Zeile". Dann VorhandeneDatei.txt löschen und Neu.txt umbenennen.
Insgesamt ist Batch dafür NICHT das geeignete Werkzeug.
Eine Windows-Registry sieht insgesamt so aus, als wären da schon mehrere durchgefegt.
Hast Du denn da ein sinnvolles Beispiel/Ziel?
Die Registry ist, als Textfile lesbar gemacht, ein x-MegaByte-Datenklumpen, in dem Du natürlich sequenziell nach einem Text suchen kannst. Wenn Du eine lesbare x-MegaByte-Datenklumpenkopie hast.
Ist allerdings bei hierarchischen Strukturen wie der Registry eher ...tja, wie sag ich's.... keine effiziente Strategie.
Macht nicht mal M$ selbst so, und die sind nicht sonderlich gewitzt.
Wozu sollte es weiter ausgeführt werden?
Selbst wenn es nur Prosa ist: wozu sollte ich mir einen Krimi zu Ende durchlesen, wenn die Seiten 3-87 wegen eines Fehlers leer sind?
Beispiel: "MeinBatch.bat >Mein.Log"
Wenn man/frau doch nur davon liest, es aber noch niemand gesehen hat, dann ist es doch gleichwertig mit Nessie, Elektrosmog oder dem Aufschwung.
Ist doch kein Philosophie-Forum hier.
Erst alles in eine Logdatei schreiben, wenn fertig, dann dem Benutzer diese Logdatei mit "type" zeigen.
Gruss
Biber
willkommen im Forum.
Ich beschäftige mich nun schon etwas länger mit Batch, ...
Gut. Solche Profis brauchen wir. Besuch uns doch mal im Bereich "Batch & Shell".- Ich kann eine Datei entweder mit ">" überschreiben oder mit ">>" ans Ende der Datei schreiben.
Wie aber kann ich an den Anfang der Datei schreiben,
Indem Du das Vorhandene als Neues an das eigentlich Neue anhängst.Wie aber kann ich an den Anfang der Datei schreiben,
Statt "echo Neue Zeile >>VorhandeneDatei.txt" jetzt
echo NeueZeile >neu.txt
copy neu.txt+VorhandeneDatei.txt
> in Neu.txt steht jetzt alles beginnend mit "Neue Zeile". Dann VorhandeneDatei.txt löschen und Neu.txt umbenennen.
oder gar etwas an das Ende oder den Anfang einer Xten Zeile? Ist das irgentwie realisierbar?
Nur durch zeilenweises Lesen der Quelldatei und selektives Schreiben einer Outputdatei mit einer FOR/F-Anweisung.Insgesamt ist Batch dafür NICHT das geeignete Werkzeug.
- Gibt es eine Möglichkeit die Registry mit einem Wildcat nach Einträgen zu durchsuchen?
Natürlich kannst Du Wildkatzen durch die Registry jagen.Eine Windows-Registry sieht insgesamt so aus, als wären da schon mehrere durchgefegt.
Hast Du denn da ein sinnvolles Beispiel/Ziel?
Die Registry ist, als Textfile lesbar gemacht, ein x-MegaByte-Datenklumpen, in dem Du natürlich sequenziell nach einem Text suchen kannst. Wenn Du eine lesbare x-MegaByte-Datenklumpenkopie hast.
Ist allerdings bei hierarchischen Strukturen wie der Registry eher ...tja, wie sag ich's.... keine effiziente Strategie.
Macht nicht mal M$ selbst so, und die sind nicht sonderlich gewitzt.
- Warum kommt es öfters vor, dass sich ein Batch-Fenster nicht von alleine schließt?
Das passiert besonders häufig, wenn es von einer anderen Datei gestartet wurde.
Auch ein "Exit" oder "del %0" an das Ende dieser Datei bringt nichts.
Programmierfehler. Falscher Aufruf.Das passiert besonders häufig, wenn es von einer anderen Datei gestartet wurde.
Auch ein "Exit" oder "del %0" an das Ende dieser Datei bringt nichts.
- Wenn es in meinem Programm einen Syntaxfehler gibt, wie kann ich erreichen,
Wenn es Syntaxfehler gibt, ist es kein Programm, sondern ungetestete Prosa.... dass das Programm trotzdem weiter ausgeführt wird und die Zeile nur übersprungen wird?
(Beispiel: "goto irgendwo" obwohl es das Label :irgendwo gar nicht gibt)
Welches Programm? Wir hatten doch gerade festgestellt, dass... Na, egal.(Beispiel: "goto irgendwo" obwohl es das Label :irgendwo gar nicht gibt)
Wozu sollte es weiter ausgeführt werden?
Selbst wenn es nur Prosa ist: wozu sollte ich mir einen Krimi zu Ende durchlesen, wenn die Seiten 3-87 wegen eines Fehlers leer sind?
- Wie kann ich ALLE Ausgaben generell umleiten, ohne dies hinter jeden Befehl schreiben zu müssen?
Indem Du die Ausgabe des gesamten Batchs umleitest.Beispiel: "MeinBatch.bat >Mein.Log"
Ich lese immer wieder etwas von CTTY, aber das funktioniert nicht und der Befehl taucht auch nicht in der offiziellen Windows Befehlszeilenreferenz auf.
Tja... müssen wir ihn dann hier behandeln?Wenn man/frau doch nur davon liest, es aber noch niemand gesehen hat, dann ist es doch gleichwertig mit Nessie, Elektrosmog oder dem Aufschwung.
Ist doch kein Philosophie-Forum hier.
- Kann ich eine Ausgabe mehrmals umleiten, z.B. so, dass dem Benutzer die Ausgabe angezeigt wird,
sie aber gleichzeitig AUCH in einen Logdatei umgeleitet wird?
Nur mit Hilfsutilities wie Tee.exe/mtee.exe oder durch Nacheinander-Tun.sie aber gleichzeitig AUCH in einen Logdatei umgeleitet wird?
Erst alles in eine Logdatei schreiben, wenn fertig, dann dem Benutzer diese Logdatei mit "type" zeigen.
Gruss
Biber

Hallo Geplagter,
Sorry das ich mich hier einmische, bin bei weitem kein Batch-Könner wie Biber, aber ich glaube in 2 Sachen kann ich Dir helfen.
Wie genau soll ich das anstellen?
call "start.bat" > startbat_log.txt
1*
Ich stand vor dem Problem das in einem Batch-Programm, bestehend aus mehreren Batch-Dateien (welche sich auch mehrfach gegenseitig aufrufen) es immer wieder vorkam, das nach Batchinternen Aktionen auf anderen LW/Pfaden als das Pfadverzeichnis der Start-Batch selbst, ich die Fehlermeldung bekam "Pfad zur Batch nicht gefunden".
Seitdem schreibe ich am Anfang einer Batch jetzt immer
Bsp.: Deine Start-Batch befindet sich im Pfad "G:\test\geplagter\start.bat"
Dann haben die Variablen folgenden Inhalt:
Vorteil:
1. ich kann die Batch ab jetzt in jedes Verzeichnis und jedes LW kopieren/installieren und das Programm funktioniert dennoch immer 100% weil,
2. die Variable %startpfad% vor <Batch-Name> gestellt enthält automatisch immer den korrekten Pfad zur Batch die ich aufrufen will/muss.
Bei Dir ergäbe das also:
Wenn es interessiert und Du WIN 2000 oder XP verwendest, stelle ich Dir das Batchprogramm von dem ich hier spreche gerne mal zum studieren des Quellcodes zur Verfügung. Ist so vielleicht noch anschaulicher für Dich! Wenn Du also willst sende ich dir den Link zum runterladen in dein Postfach!
gruß
onegasee59
Sorry das ich mich hier einmische, bin bei weitem kein Batch-Könner wie Biber, aber ich glaube in 2 Sachen kann ich Dir helfen.
Inhalt von start.bat
8<------------------------
echo irgendwas
:: Hier steht ein Kommentar
start test.bat <------------------------ schreibe hier immer "call" statt "start", dann sollte das Problem gelöst sein. siehe auch 1*
echo Blablablubb
ping /N 5 localhost
8<------------------------
8<------------------------
echo irgendwas
:: Hier steht ein Kommentar
start test.bat <------------------------ schreibe hier immer "call" statt "start", dann sollte das Problem gelöst sein. siehe auch 1*
echo Blablablubb
ping /N 5 localhost
8<------------------------
Beispiel: "MeinBatch.bat >> Mein.Log"
Wie genau soll ich das anstellen?
call "start.bat" > startbat_log.txt
1*
Ich stand vor dem Problem das in einem Batch-Programm, bestehend aus mehreren Batch-Dateien (welche sich auch mehrfach gegenseitig aufrufen) es immer wieder vorkam, das nach Batchinternen Aktionen auf anderen LW/Pfaden als das Pfadverzeichnis der Start-Batch selbst, ich die Fehlermeldung bekam "Pfad zur Batch nicht gefunden".
Seitdem schreibe ich am Anfang einer Batch jetzt immer
@echo off && setlocal
set startpfad=%~dp0 -----> Syntax = "LW:\Pfad zur Batch\"
set startLW=%~d0\ -------> Syntax = "LW:\" (des Startpfades der Batch - nur für spezielle Anwendungen bei mir benötigt)
set pfadohneLW=%~p0 -----> Syntax = "\Pfad zur Batch\" (ohne LW: - nur für spezielle Anwendungen bei mir benötigt)
Bsp.: Deine Start-Batch befindet sich im Pfad "G:\test\geplagter\start.bat"
Dann haben die Variablen folgenden Inhalt:
%startpfad% = "G:\test\geplagter\"
%startLW% = "G:\"
%pfadohneLW% = "\test\geplagter\"
Vorteil:
1. ich kann die Batch ab jetzt in jedes Verzeichnis und jedes LW kopieren/installieren und das Programm funktioniert dennoch immer 100% weil,
2. die Variable %startpfad% vor <Batch-Name> gestellt enthält automatisch immer den korrekten Pfad zur Batch die ich aufrufen will/muss.
Bei Dir ergäbe das also:
::start.bat
@echo off && setlocal
set startpfad=%~dp0
echo irgendwas
:: Hier steht ein Kommentar
call "%startpfad%test.bat"
echo Blablablubb
%windir%\system32\ping.exe /n 5 localhost
endlocal
::ende start.bat
::test.bat
echo Ich bleibe (jetzt nie wieder :-)) offen
set irgendwas=irgendwas
::ende test.bat
Wenn es interessiert und Du WIN 2000 oder XP verwendest, stelle ich Dir das Batchprogramm von dem ich hier spreche gerne mal zum studieren des Quellcodes zur Verfügung. Ist so vielleicht noch anschaulicher für Dich! Wenn Du also willst sende ich dir den Link zum runterladen in dein Postfach!
gruß
onegasee59

Definition laut Befehlszeilenreferenz (Hilfe)
Der Befehl "call" gewährleistet Dir einfach gesagt das nach Abarbeitung alle nachfolgenden Befehle der Rücksprung wieder 100% exakt zum aufrufenden call-Befehl erfolgt. In deinem Fall also das in die aufrufende Batch nach Abarbeitung der aufgerufenen Batch ein exakter Rücksprung zum call-Befehl erfolgt und die aufgerufene und abgearbeitete Batch beendet/geschlossen wird.
Diese Funktionsweise des Call-Befehls macht man sich daher auch bei der Erstellung von Subroutinen in Batch per "call: <namederSubroutine>" zu Nutze. siehe dazu das HowTo ---> HowTo - Wie man Subroutinen in Batchfiles erstellt
Hoffe es verdeutlicht Dir anschaulicher als ich es vermag die Funktion des call-Befehls zu verstehen.
@Biber
Ich hoffe ich hab das jetzt einigermaßen korrekt beschrieben habe, wenn nicht bitte in meinem Text korrigieren! Danke
onegasee59
start
Startet ein gesondertes Fenster Eingabeaufforderung, um ein angegebenes Programm oder einen angegebenen Befehl auszuführen.
Ohne Parameter öffnet start ein zweites Fenster mit einer Eingabeaufforderung.
Call
Ruft aus einem Batchprogramm ein anderes Batchprogramm auf, ohne das übergeordnete Batchprogramm zu beenden.
Der Befehl call akzeptiert auch Marken als Sprungziel.
Call hat keinerlei Auswirkungen in einer Befehlszeile, wenn es außerhalb einer Skript- oder Batchdatei verwendet wird.
Der Befehl "call" gewährleistet Dir einfach gesagt das nach Abarbeitung alle nachfolgenden Befehle der Rücksprung wieder 100% exakt zum aufrufenden call-Befehl erfolgt. In deinem Fall also das in die aufrufende Batch nach Abarbeitung der aufgerufenen Batch ein exakter Rücksprung zum call-Befehl erfolgt und die aufgerufene und abgearbeitete Batch beendet/geschlossen wird.
Diese Funktionsweise des Call-Befehls macht man sich daher auch bei der Erstellung von Subroutinen in Batch per "call: <namederSubroutine>" zu Nutze. siehe dazu das HowTo ---> HowTo - Wie man Subroutinen in Batchfiles erstellt
Hoffe es verdeutlicht Dir anschaulicher als ich es vermag die Funktion des call-Befehls zu verstehen.
@Biber
Ich hoffe ich hab das jetzt einigermaßen korrekt beschrieben habe, wenn nicht bitte in meinem Text korrigieren! Danke
onegasee59
Moin Jeplagter,
onegasee hat das meiste ja schon vorbildlich beantwortet.
Zu den noch unklaren Punkten:
Nein, gibt es nicht.
Bei Interpretern kann es nicht sinnvoll ein "On Error Goto Next" oder ähnliches geben.
Programmatische Ablauf-Fehler wie Datei/Verzeichnis/RegKey nicht vorhanden musst Du halt durch entsprechende if exist-Prüfungen o.ä. abfangen; Fehler von aufgerufenen internen oder externen Befehlen [copy, del, XCopy....] anhand des Errorlevels prüfen.
Syntaxfehler dagegen lassen sich nicht abfangen/unterdrücken.
Die Mimik mit CTTY NUL/CTTY CON ist definitiv ein Relikt aus den DOS-Zeiten und hat seine Wurzeln noch im CP/M.
Auch wenn Du das noch neulich irgendwo gelesen hast, dann ist diese Quelle möglicherweise schon im Ruhestand oder recycled.
Abgesehen davon ist/war die Stossrichtung eine ganz andere:
Mit der CTTY-Umlenkung soll(te) bezweckt werden, dass keine störenden Benutzeraktionen wie zum Beispiel das Abbrechen des Batches möglich sind.
CTTY NUL ----> keine Tastureingabe möglich--->kein Abbruch möglich
CTTY CON ---->wieder Normalzustand.
Falls allerdings der zweite Befehl [CTTY CON] niemals erreicht wird, z.B. weil doch noch irgendwelche Fehler nicht abgefangen werden, dann hat der Anwender ein kleines Problem...
Anyhow - das CTTY-Geraffel benötigst Du nicht für Deine Umleitungsanforderung.
Gruss
Biber
onegasee hat das meiste ja schon vorbildlich beantwortet.
Zu den noch unklaren Punkten:
Gut, ich möchte aber trotzdem wissen, ob es eine Möglichkeit [des Fortfahrens bei Fehlern] gibt.
Ob sie nun gut oder sehr unelegant ist, sei dahingestellt.
Ob sie nun gut oder sehr unelegant ist, sei dahingestellt.
Nein, gibt es nicht.
Bei Interpretern kann es nicht sinnvoll ein "On Error Goto Next" oder ähnliches geben.
Programmatische Ablauf-Fehler wie Datei/Verzeichnis/RegKey nicht vorhanden musst Du halt durch entsprechende if exist-Prüfungen o.ä. abfangen; Fehler von aufgerufenen internen oder externen Befehlen [copy, del, XCopy....] anhand des Errorlevels prüfen.
Syntaxfehler dagegen lassen sich nicht abfangen/unterdrücken.
....überall CTTY gelesen...
Die Mimik mit CTTY NUL/CTTY CON ist definitiv ein Relikt aus den DOS-Zeiten und hat seine Wurzeln noch im CP/M.
Auch wenn Du das noch neulich irgendwo gelesen hast, dann ist diese Quelle möglicherweise schon im Ruhestand oder recycled.
Abgesehen davon ist/war die Stossrichtung eine ganz andere:
Mit der CTTY-Umlenkung soll(te) bezweckt werden, dass keine störenden Benutzeraktionen wie zum Beispiel das Abbrechen des Batches möglich sind.
CTTY NUL ----> keine Tastureingabe möglich--->kein Abbruch möglich
CTTY CON ---->wieder Normalzustand.
Falls allerdings der zweite Befehl [CTTY CON] niemals erreicht wird, z.B. weil doch noch irgendwelche Fehler nicht abgefangen werden, dann hat der Anwender ein kleines Problem...
Anyhow - das CTTY-Geraffel benötigst Du nicht für Deine Umleitungsanforderung.
Gruss
Biber