florence
Goto Top

Batch- Ausgabe in .txt fehlerhaft

Hallo!
Nachdem ich nun schon einige Zeit stiller Mitleser bin und sehr von dem geballten Sachverstand hier profitiert habe, eine Frage, bei der ich nicht mehr weiterkomme und zu der ich hoffe, dass Ihr Tipps habt.

Ich habe ein Makro in VBA geschrieben, das Werte aus diversen Excel-Files ausliest und eine .bat aufruft, der diese Werte übergeben werden und die damit Berechnungen (u.a. Hashwerte) durchführt. Der .bat Aufruf erfolgt mehrfach über eine Schleife. Mit nachfolgendem Code überwache ich, dass die Schleife in VBA, die den mehrfachen Aufruf durchführt, erst weiterläuft, wenn die .bat abgeschlossen ist.

Sub Timeout()
    Dim wsh As Object
    Dim waitOnReturn As Boolean
    Dim windowStyle As Integer
    Dim errorCode As Integer
    
    Set wsh = VBA.CreateObject("WScript.Shell")  
    waitOnReturn = True
    windowStyle = 1
    errorCode = wsh.Run("CMD /c call "".BATDATEI""", windowStyle, waitOnReturn)  
    If errorCode = 0 Then
        MsgBox "Done! No error to report."  
      Else
        MsgBox "Program exited with error code " & errorCode & "."  
    End If
End Sub

Die Ergebnisse der .bat werden in eine .txt geschrieben. Und hier kommt das Problem: Die Ausgabe in der .txt erfolgt immer wieder fehlerhaft und bei jedem Durchlauf anders fehlerhaft. Es wirkt also, als ob die .bat "stolpern" würde, und die ein oder andere Zeile nicht in die .txt schreiben würde obwohl das echo aufgerufen wird. Auf meinem PC funktioniert es o.W., rufe ich das Makro jedoch über einen remote-Zugriff (und eine langsamere Verbindung) auf, kommt es immer wieder zu diesen Problemen mit der Ausgabe.

Der Code für die Ausgabe im .txt sieht so aus:

Dieser Kopf wird beim ersten Aufruf geschrieben:
echo Liebe Kolleginnen und Kollegen, > "%ausgabedatei%"  
			echo lieber Herr xxx, >> "%ausgabedatei%"  
			echo. >> "%ausgabedatei%"  
			echo text text text . >> "%ausgabedatei%"  
			echo text text text. >> "%ausgabedatei%"  
			echo. >> "%ausgabedatei%"  
			echo text text text. >> "%ausgabedatei%"  
			echo text text text. >> "%ausgabedatei%"  
			echo. >> "%ausgabedatei%"  
			echo Mit freundlichen Gruessen >> "%ausgabedatei%"  
			echo. >> "%ausgabedatei%"  
			echo Datum, Unterschrift >> "%ausgabedatei%"  
			echo. >> "%ausgabedatei%"  

Dann wird bei den weiteren Aufrufen immer eine Ausgabe für die jeweiligen Berechnungen (nach dem gleichen Muster, Zeile für Zeile wird in die .txt geschrieben) angefügt.

Lasse ich das Programm mehrfach laufen, ist die Ausgabe manchmal korrekt und manchmal falsch, immer wieder unterschiedlich (also fehlt z.B. einmal die Zeile 2 "lieber Herr xxx", dann fehlt wieder die Zeile "Datum, Unterschrift" etc.).

Ich nehme an, nachdem der Fehler nur in schlechter Verbindung auftaucht, dass es schlichtweg ein Verbindungsproblem ist. Gibt es eine Möglichkeit, den Text vllt. nur mit einem echo in die Ausgabedatei zu schreiben und anderweitig zu formatieren, dass Zeilenumbrüche etc. angezeigt werden statt Zeile für Zeile vorzugehen, wie ich das bisher mache?

Oder aber bin ich auf dem Holzweg und der Fehler steckt woanders?

Ich bin wirklich für jede Hilfestellung dankbar, weil ich langsam am Ende mit meinem Latein bin und mich wundere, warum ein Programm auf dem einen Rechner einwandfrei funktioniert und auf dem anderen nicht?

Ich danke Euch bereits ganz herzlich im Voraus!

Viele liebe Grüße

Florence

Content-Key: 585860

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

Printed on: April 19, 2024 at 15:04 o'clock

Member: Pjordorf
Pjordorf Jul 09, 2020 at 00:10:55 (UTC)
Goto Top
Hallo,

Zitat von @Florence:
Auf meinem PC funktioniert es o.W., rufe ich das Makro jedoch über einen remote-Zugriff (und eine langsamere Verbindung) auf, kommt es immer wieder zu diesen Problemen mit der Ausgabe.
W0 liegt denn diese TXT Datei deine %ausgabedatei% aus sicht vom RemoteClient Lokal, Server, NAS, VPN? Lass doch auf den RemoteClient schreiben, ist es dann besser?

Oder aber bin ich auf dem Holzweg und der Fehler steckt woanders?
Da wir hier nur ein Bruchstück sehen ist es schwer zu sagen oder einfach nur geraten.

Ich bin wirklich für jede Hilfestellung dankbar, weil ich langsam am Ende mit meinem Latein bin und mich wundere, warum ein Programm auf dem einen Rechner einwandfrei funktioniert und auf dem anderen nicht?
Meistens weil nicht jeder Rechner gleich ist. face-smile

Gruß,
Peter
Member: eisbein
Solution eisbein Jul 09, 2020 at 05:38:56 (UTC)
Goto Top
Hallo,

Auf meinem PC funktioniert es o.W., rufe ich das Makro jedoch über einen remote-Zugriff (und eine langsamere Verbindung) auf, kommt es immer wieder zu diesen Problemen mit der Ausgabe.

Versuche mal deinen Text, den du mit echo ausgibst, zuerst vollständig als Variable zu generieren und dann mit nur einer echo-Anweisung auszugeben. Dadurch hast du nur 1 Schreibzugriff und langsame Verbindungen sollten keine Probleme machen. face-wink

Gruß
eisbein
Member: Fennek11
Fennek11 Jul 09, 2020 at 06:20:13 (UTC)
Goto Top
Hallo,

warum diese Konstruktion mit Shell? VBA kann direkt Text-Dateien schreiben.

mfg
Member: Florence
Florence Jul 09, 2020 at 07:24:05 (UTC)
Goto Top
Hallo,

zunächst einmal ganz vielen lieben Dank für Eure Tipps und Hilfe! Ihr seid echt großartig face-smile

Zitat von @Fennek11:

Hallo,

warum diese Konstruktion mit Shell? VBA kann direkt Text-Dateien schreiben.

mfg

Das ist leider den Vorgaben geschuldet, für die ich dieses Makro geschrieben habe. Es gibt einen Projektvertrag in dem drinsteht, dass Certutil für die Hashwertberechnung genutzt werden soll.

Versuche mal deinen Text, den du mit echo
ausgibst, zuerst vollständig als Variable zu
generieren und dann mit nur einer echo-
Anweisung auszugeben. Dadurch hast du nur
1 Schreibzugriff und langsame Verbindungen
sollten keine Probleme machen.

Genau so etwas schwebt mir vor, ich gestehe aber, dass ich an dem Problem Zeilenumbruch/Absätze scheitere. Dh. Wie bekomme ich es hin, dass ich nicht einen langen Text übergebe, sondern schön mit Absätzen? Ich bin da noch nicht so versiert mir den .bats, weiß nur, dass die Formatierungsmöglichkeiten sehr begrenzt sind und mit dem Einbauen von \n \r In den String bin ich nicht wirklich weitergekommen (wird einfach als Text ausgegeben).

Ich versuche nachher noch den ganzen Code zu posten, schreibe nur gerade vom Handy. Beide Dateien liegen remote im gleichen Verzeichnis, was aber nicht immer so war - ich habe auch den Eindruck, dass „gleiches Verzeichnis“ das Problem verringert.

Heute funktioniert es übrigens wieder stabil 😆 aber ich würde es eben auch gerne stabil haben wenn das System laggt, damit das Programm wirklich bequem für den (nicht-IT-affinen) Anwender ist.

Viele liebe Grüße

Florence
Member: eisbein
eisbein Jul 09, 2020 updated at 09:51:51 (UTC)
Goto Top
Hallo,

Genau so etwas schwebt mir vor, ich gestehe aber, dass ich an dem Problem Zeilenumbruch/Absätze scheitere. Dh. Wie bekomme ich es hin, dass ich nicht einen langen Text übergebe, sondern schön mit Absätzen? Ich bin da noch nicht so versiert mir den .bats, weiß nur, dass die Formatierungsmöglichkeiten sehr begrenzt sind und mit dem Einbauen von \n \r In den String bin ich nicht wirklich weitergekommen (wird einfach als Text ausgegeben).

Genau das geht eben mit echo nicht .... face-sad
Powershell ist keine Alternative?

Ich habe hier einen Thread gefunden, hier klappt es bei der Display-Ausgabe. Vielleicht hilft dir der Ansatz:
Batch - Variable mit Zeilenumbruch

Edit: basiert aber wierder auf mehrfachen echos...

Gruß
eisbein
Mitglied: 144705
Solution 144705 Jul 09, 2020 updated at 10:45:15 (UTC)
Goto Top
So geht das auch
>"%ausgabedatei%" (  
    echo Das
    echo ist
    echo ein
    echo Test
)
Damit wir nur einmalig ein Schreibvorgang vorgenommen.

Aber wie schon vorgeschlagen wurde, einfach alles in die Powershell tüten, dann ist auch certutil für Hash-Berechnung überflüssig, da alle NET Klassen dafür zur Verfügung stehen ...
Member: Florence
Florence Jul 09, 2020 at 21:28:47 (UTC)
Goto Top
Zitat von @144705:

So geht das auch
>>"%ausgabedatei%" (  
>     echo Das
>     echo ist
>     echo ein
>     echo Test
> )
> 
Damit wir nur einmalig ein Schreibvorgang vorgenommen.

Aber wie schon vorgeschlagen wurde, einfach alles in die Powershell tüten, dann ist auch certutil für Hash-Berechnung überflüssig, da alle NET Klassen dafür zur Verfügung stehen ...


Du bist großartig, vielen Dank!! Da sieht man mal wieder, wo man hinkommt, wenn man sich nur schnell in .bat einliest face-smile Habe die batch so umgebaut und siehe da, sie springt wie ein junges Reh. Habe es gerade eben mit der langsamsten remote-Verbindung, die ich hinbekommen kann getestet und es läuft jetzt völlig unproblematisch.

Fazit: Es dürften tatsächlich fehlgehende Schreibzugriffe gewesen sein und jetzt läuft es alles schön stabil und die Bosses sind happy face-smile

PowerShell geht wie gesagt nicht wegen der recht detaillierten Ausführungsvorgaben in unserem ProjektVT (die Sinnhaftigkeit des Ganzen steht auf einem anderen Blatt... face-smile ).



Ich habe hier einen Thread gefunden, hier klappt es bei der Display-Ausgabe. Vielleicht hilft dir der Ansatz:
Batch - Variable mit Zeilenumbruch

Das habe ich (in einer etwas sehr viel einfacheren Variante - Code s.u., habe das jetzt aber aus dem Gedächtnis aufgeschrieben, d.h. kann sein dass iwo ein Fehler drin steckt) auch probiert - funktioniert auch wunderbar in der Konsolenausgabe per echo, leider aber nicht, wenn es in eine .txt ausgegeben wird.

@echo off & setlocal enabledelayedexpansion
SET Zeilenumbruch=^  


SET Textausgabe=Erste Zeile Text !Zeilenumbruch! zweite Zeile Text

echo %Textausgabe%

ergibt in der Konsole:
Erste Zeile Text
Zweite Zeile Text

Mein Problem dürfte somit gelöst sein, vielen lieben Dank Euch allen!

Florence