geplagter
Goto Top

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.

Content-Key: 52875

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

Ausgedruckt am: 28.03.2024 um 23:03 Uhr

Mitglied: Biber
Biber 28.02.2007 um 21:17:01 Uhr
Goto Top
Moin Geplagter,

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

- 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.
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.
Erst alles in eine Logdatei schreiben, wenn fertig, dann dem Benutzer diese Logdatei mit "type" zeigen.

Gruss
Biber
Mitglied: Geplagter
Geplagter 28.02.2007 um 22:43:11 Uhr
Goto Top
Erstmal muss ich entschuldigen, ins falsche Forum gepostet zu haben - ich sah hier einen anderen Beitrag, in dem es um Batch ging und weil dort nichts dergleichen erwähnt wurde und ich nicht gedacht hätte, dass es ausgerechnet unter "Entwicklung" einen Batch-Bereich gibt, habe ich nun leider hier gepostet.
Vielleicht ist ein Moderator so gütig und verschiebt es.

Moin Geplagter,

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".

Geht es nicht noch etwas sarkastischer?
Da fühlt man sich doch gleich wie zu Hause...


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

Okay hier ein Beispiel:

Inhalt von start.bat
8<------------------------
echo irgendwas
:: Hier steht ein Kommentar
start test.bat
echo Blablablubb
ping /N 5 localhost
8<------------------------

Inhalt von test.bat
8<------------------------
echo Ich bleibe offen
set irgendwas=irgendwas
8<------------------------

Das komische ist nun... die Datei bleibt nicht IMMER offen... aber ungefähr jedes dritte von vier malen.
Hast du dafür eine Erklärung?


> - Wenn es in meinem Programm einen
> Syntaxfehler gibt, wie kann ich erreichen,
Wenn es Syntaxfehler gibt, ist es kein
Programm, sondern ungetestete Prosa.

Gut, ich möchte aber trotzdem wissen, ob es eine Möglichkeit gibt.
Ob sie nun gut oder sehr unelegant ist, sei dahingestellt.


> - 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"

Wie genau soll ich das anstellen?

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

Auf genau diese Antwort hatte ich gehofft.

Ist doch kein Philosophie-Forum hier.

Langsam kommt es mir so vor...

Nunja, ich danke dir für deine Mühe. Wir Profis müssen uns gegenseitig helfen..

Gruss
Biber

Gruss zurück
Mitglied: 36539
36539 28.02.2007 um 23:09:20 Uhr
Goto Top
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.

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<------------------------

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
Mitglied: Geplagter
Geplagter 28.02.2007 um 23:21:35 Uhr
Goto Top
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.

> 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.
> echo Blablablubb
> ping /N 5 localhost
> 8<------------------------

Ja funktioniert. Ich dachte der einzige Unterschied zwischen einem "call" und einem "start" einer Batch-Datei, sei der, dass bei einem "start" die ursprüngliche Datei angehalten wird, bis die andere beendet ist und bei call nicht.
*confused*

>> Beispiel: "MeinBatch.bat
>> Mein.Log"
>
> Wie genau soll ich das anstellen?

call "start.bat" >
startbat_log.txt

gruß
onegasee59

Naja, ich kann natürlich den Umweg gehen und eine Datei erstellen, die die ursprüngliche Datei dann so startet.
Kann ich das aber nicht auch erreichen, wenn die Datei vom Benutzer ausgeführt wird, ohne diesen Umweg zu gehen?
Danke auch an dich. :D
Mitglied: 36539
36539 01.03.2007, aktualisiert am 18.10.2012 um 18:31:42 Uhr
Goto Top
Definition laut Befehlszeilenreferenz (Hilfe)
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 face-smile

onegasee59
Mitglied: Biber
Biber 01.03.2007 um 11:32:14 Uhr
Goto Top
Moin Jeplagter,

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.

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