bugmenot
Goto Top

Problem mit batch beim schreiben in .log- und txt-Dateien (UnixToolsForwindows bringt auch nichts), Versuch über zweite batch klappt auch nicht

Ich habe ja nichts gegen knobeln und aufgeben mag ich auch nicht, aber hier weiß ich einfach nicht mehr weiter.

Ich habe eine batch deren Inhalt als log und txt-Datei ausgegeben und weiterverarbeitet werden soll. Nun lässt es sich ja unter Windows leider nicht realisieren, dass durch die Verwendung der beiden Operatoren “>>“ das ganze gleichzeitig in der Konsole angezeigt und in die Dateien geschrieben wird.

Wenn ich nun aber einfach weiter unten in der batch folgendes einsetze

eml2.bat >> D:\cwRsync-Intern-%date%.txt

schreibt er mir zwar bis genau zu dieser Zeile die batsch in die beiden Dateien, führt das Skript aber nicht zu Ende und bleibt einfach stehen, so das die weiteren befehle nicht ausgeführt werden können. Ich kann mir gut vorstellen, dass sich hier die Katze die ganze Zeit in den Schwanz beißt…

Da ich (hier?) irgendwo gelesen habe, dass durch UnixToolsForwindows der Befehl “tee“ verwendet werden kann, hab ich das auch mal ausprobiert. Leider funktioniert das aber auch nicht. Er zeigt mit dann zum Beispiel in der betreffenden Zeile in der Konsole immer

15.08.2008 tee D:\cwRsync-Intern-%date%.txt

an. Ich habe da auch schon länger im Internet nachgeschaut, verschiedene Varianten und Ergänzungen ausprobiert, aber nichts gefunden was das Problem gelöst hat.

Schon mal danke fürs lesen

Gruß

. . .

Noch mal Hallo

Da ich das Problem so nicht lösen konnte, habe ich mir eine zweite batch geschrieben, die durch die erste aufgerufen wird.

Die zweite wird in der ersten durch

Call mitschreiben.bat

aufgerufen.

Die zweite enthält die Zeile

eml2.bat >> D:\eml2-%date%.txt

Das Problem ist nun, dass er mir in der Konsole alles bis zu der Zeile

Call mitschreiben.bat

anzeigt, dann aber die Fehlermeldung „Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird“ ausgibt.
Das absurde ist dabei, das die nach dem Call-Befehl geplante Ja/Nein-Abfrage und die daraus resultierenden Aufgaben durchgeführt und deren Ergebnisse ebenfalls in die txt-Datei ausgegeben werden können, obwohl er die ganze Zeit nur diese Fehlermeldung anzeigt.

Gruß

Content-Key: 94490

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

Printed on: April 25, 2024 at 23:04 o'clock

Member: Top44
Top44 Aug 15, 2008 at 08:02:55 (UTC)
Goto Top
Moin, ich meine doch du müsstest ein CALL bzw. Start davor setzten.

grüße
Member: bugmenot
bugmenot Aug 15, 2008 at 13:41:47 (UTC)
Goto Top
Hallo

Bei “call“ erhalte ich die Fehlermeldung, dass nicht auf den Prozess zugegriffen werden kann, da er von einem anderen Prozess verwendet wird.

Bei “start“ öffnet er mir die batch noch mal, und zeigt dann in ihr ebenfalls die obige Fehlermeldung an.

Das spricht also alles irgendwie für die Katze-Schwanz-Theorie.
Vielleicht muss ich das einfach über eine zweite batch realisieren.

Trotzdem danke

Gruß
Member: AndreasA
AndreasA Aug 15, 2008 at 15:19:47 (UTC)
Goto Top
Hallo bugmenot,

definiere in deinem Windowsbatch die Ausgabedatei als Variable

SET AUSGABETXT=D:\cwRsync-Intern-%date%.txt

Jede Zeile die nun in diese Textdatei geschrieben werden soll

befehl | tee -a %ausgabetxt%

sollte erstmal Ausgabe auf Console und in die Txt-Datei schreiben.

Bis hierhin soweit einfach zu realisieren. Jetzt der ungetestete Ansatz:
rufe dein Skript (z.B. batch.cmd) auf der Kommandozeile folgendermaßen auf
batch.cmd | tee -a batch.log

Das heisst nun müsste alles was dein Skript macht in die Textdatei geschrieben werden und die Ausgabe deines Skriptes auf der Kommandozeile alles in die Logdatei (batch.log) schreiben.

Habe jetzt kein tee.exe zum testen hier, aber ein Versuch ist es Wert.

Gruß AndreasA
Member: bugmenot
bugmenot Aug 15, 2008 at 15:50:52 (UTC)
Goto Top
Hallo

Ich hab die batch als Variable definiert und dann folgendes ausprobiert

befehl | tee -a %ausgabetxt%

Dabei bricht er aber auch direkt ab und die Konsole wird geschlossen.

Lasse ich den Operator “|“ weg, schreibt er mir wieder nur die ganze Zeile in die Konsole aber nicht in die Dateien.

Um deinen zweiten Vorschlag auszuprobieren hab ich

eml2.bat tee | -a D:\cwRsync-Intern-%date%.txt

in eine der Zeilen geschrieben. Er zeigt mir dann den Inhalt bis zu eben dieser Zeile an und bricht ab. In die Dateien wird dabei leider auch nichts geschrieben.

Trotzdem danke

Gruß
Member: AndreasA
AndreasA Aug 16, 2008 at 08:49:27 (UTC)
Goto Top
Hallo nochmal,

kurze Anmerkung hast du die Datei

D:\cwRsync-Intern-%date%.txt vorher schon initialisiert? D.h. existiert die Datei für z.B. heute
D:\cwRsync-Intern-16.08.2008.txt schon bevor du sie mit der Umleitung ansprichst? Wenn nein, ist klar warum er an der Stelle abbricht. Er würde bei jeder Zeile versuchen sie neu zu erstellen. Deshalb ja mein Vorschlag diese Datei als Variable zu definieren und sie vor irgendeiner Umleitung einmal zu initialisieren.

Versuchs mal
Member: bugmenot
bugmenot Aug 17, 2008 at 04:43:15 (UTC)
Goto Top
Hallo

Sie als Variable zu definieren ist kein Problem, aber was meinst du denn mit "initialisieren"?

Gruß
Member: AndreasA
AndreasA Aug 17, 2008 at 15:39:27 (UTC)
Goto Top
Hallo

Mit "initialisieren" meine ich diese Datei vorher zu erzeugen... z.B. so

set ausgabedatei=D:\cwRsync-Intern-%date%.txt
echo.>%ausgabedatei%
D.h. ab hier existiert deine Datei schon und dann in deinem Skript weiter
......
em2l.bat | tee -a %ausgabedatei%

Soweit verstanden?
Member: bugmenot
bugmenot Aug 17, 2008 at 17:37:26 (UTC)
Goto Top
Habe ich ausprobiert

Tee scheint nicht zu funktionieren und ich versuche mal herauszufinden warum. Aber eigentlich müsste es doch mit der Umleitung auch funktionieren…

Noch was zu meinem Versuch mit der Umleitung:
Es kommt immer noch die Fehlermeldung. „Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.“ Obwohl er, wie gesagt, alles aufzeichnet.

Ich denke, das Problem liegt darin, dass die zweite Batch die erste bis zum Ende aufzeichnen will. Da diese aber nicht fertig ist, kann es nicht weitergehen. Mir ist rätselhaft, wo ich diese nun beenden kann, da es ja, wenn es so ist, keine Möglichkeit dazu gibt eine Befehlszeile so zu platzieren ,das die zweit Batch ihre Tätigkeit einstellt und die erste ihre weiterführt.

Gruß
Member: AndreasA
AndreasA Aug 17, 2008 at 19:57:39 (UTC)
Goto Top
Hast du die tee.exe im Suchpfad (Variable %PATH%) enthalten? Wenn nein dann musst du in deinem Skript den Pfad zur tee.exe mit angeben.

befehl | "Pfad zu tee.exe\tee.exe" -a %ausgabedatei%

ich habe grade mal die aktuellen Unixtools geladen und mit der tee.exe funktioniert das, was du vorhast problemlos.

Was die Fehlermeldung angeht: Du darfst natürlich nicht das Skript und den Befehl im Skript an die gleiche Logdatei umleiten. Dann kommt genau von dir benannte Fehlermeldung.

Also zusammengefasst sollte alles so funktionieren:

  • Dein Skript (sagen wir mal hauptskript.cmd) schreibt alle gewünschten Ausgaben neben der Console noch in eine Logdatei (namens %logdat%)
.... REM hauptscript.cmd .....

SET LOGDAT=D:\cwRsync-Intern-%date%.log
SET UNIXTOOLS="Pfad zur TEE.exe"

...

befehl1 | %unixtools%\tee -a %logdat%
befehl x | %unixtools%\tee -a %logdat%
... u.s.w

  • du rufst dein Hauptskript mit nem Hilfsskript (helpwrite.cmd) oder direkt auf der Console mit Umleitung in eine Textdatei (%txtout%) auf

.... REM helpwrite.cmd ......
SET TXTOUT=D:\cwRsync-Intern-%date%.txt
SET UNIXTOOLS="Pfad zur TEE.exe"

hauptscript.cmd | %unixtools%\tee -a %txtout%

  • somit hast du nun 2 Dateien
    1. eine D:\cwRsync-Intern-%date%.log in dem die Ausgaben aller Befehle stehen, die du in deinem Hauptskript neben der Console umgeleitet hast
    2. und eine D:\cwRsync-Intern-%date%.txt, in der alles steht, was dein Hauptskript auf der Console ausgibt
  • und kannst alles auf der Console nebenbei lesen face-wink
Member: bugmenot
bugmenot Aug 18, 2008 at 05:20:20 (UTC)
Goto Top
Aahh. Anders als in der Anleitung beschrieben, musste ich unter Systemeigenschaften – Umgebungsvariablen – Systemvariablen bei „Pfad“ den gesamten Pfad, „;C:\Programme\UnixToolsForWindows\usr\local\wbin\“ angeben, statt nur „usr\local\wbin\“.

Tee funktioniert nun also. Allerdings nur wen ich z.B.

Echo Bla Bla | tee -a D:\eml2-%date%.txt

schreibe.

Setze ich eine Variable, z.B.

set log=%D:\eml2-%date%.txt%

und gebe den Befehl

Echo Bla Bla | tee -a %log%

funktioniert es nicht. Warum auch immer.

Vielen Dank für deine Hilfe und deine Ausdauer

Gruß
Member: AndreasA
AndreasA Aug 18, 2008 at 08:01:35 (UTC)
Goto Top
Schön das es funktioniert.
Zu deiner letzten Frage: Nimm einfach die %-zeichen weg dann geht auch das face-wink also
set log=D:\eml2-%date%.txt

Bitte gern geschehen.