Abgehackte Datenzeilen
Ich habe einen funktionierenden Batchscript. Jedoch das Problem, dass die Maschinenmeldung abgehackt übertragen werden und dann nicht auswertbar sind. Wer kann mir helfen?
Guten Morgen,
der nachstehende Batchscript funktioniert sehr gut, so lange die Maschinenmeldung über die Funkmodule komplett übertragen werden. In der letzten Zeit habe ich aber häufig das Problem, dass die Meldungen
durch Übertragungsstörungen nur unvollständig übertragen werden. Wenn die Übertragung unvollständig ist, dann wird die Meldung maximal zweimal - innerhalb 20 Sekunden - wiederholt und es kommt vor, das erst die
dritte Meldung komplett auswertbar ist. Daher nun meine Frage, was kann ich tun, das %~3 im Filter ausgewertet und %3 in die Datei "mailinhalt" mit dem vollständigem Text eingetragen wird? Die Datei a*.txt ist ein Hinweis
zum Fehlertext und beinhaltet nur eine Ziffer. Diese Übertragung ist passend und eindeutig. %4 ist ein feststehender Text und funktioniert auch.
@echo off &setlocal
chcp 1252
echo %4>>c:\subject.txt
echo %3>>c:\mailinhalt.txt
type c:\a*.txt>>c:\mailinhalt.txt
del c:\a*.txt
ping -n 8 localhost>nul
<hier beginnt der Mailversand, der auf funktioniert >
del c:\subject.txt
del c:\mailinhalt.txt
goto :eof
:weiter
del c:\a*.txt
Gruß
Christoph
Guten Morgen,
der nachstehende Batchscript funktioniert sehr gut, so lange die Maschinenmeldung über die Funkmodule komplett übertragen werden. In der letzten Zeit habe ich aber häufig das Problem, dass die Meldungen
durch Übertragungsstörungen nur unvollständig übertragen werden. Wenn die Übertragung unvollständig ist, dann wird die Meldung maximal zweimal - innerhalb 20 Sekunden - wiederholt und es kommt vor, das erst die
dritte Meldung komplett auswertbar ist. Daher nun meine Frage, was kann ich tun, das %~3 im Filter ausgewertet und %3 in die Datei "mailinhalt" mit dem vollständigem Text eingetragen wird? Die Datei a*.txt ist ein Hinweis
zum Fehlertext und beinhaltet nur eine Ziffer. Diese Übertragung ist passend und eindeutig. %4 ist ein feststehender Text und funktioniert auch.
@echo off &setlocal
echo %4>>c:\subject.txt
echo %3>>c:\mailinhalt.txt
type c:\a*.txt>>c:\mailinhalt.txt
del c:\a*.txt
ping -n 8 localhost>nul
<hier beginnt der Mailversand, der auf funktioniert >
del c:\subject.txt
del c:\mailinhalt.txt
goto :eof
:weiter
del c:\a*.txt
Gruß
Christoph
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 144698
Url: https://administrator.de/forum/abgehackte-datenzeilen-144698.html
Ausgedruckt am: 10.04.2025 um 06:04 Uhr
18 Kommentare
Neuester Kommentar

Hallo Christoph,
ich habe deinen Text jetzt 3 aml durchgelesen und weiß immer noch nicht was dein Problem und was du jetzt erwartest?
Entweder liegt es an mir oder du hast das Problem nicht ausreichend beschrieben
Gruß
LotPings
ich habe deinen Text jetzt 3 aml durchgelesen und weiß immer noch nicht was dein Problem und was du jetzt erwartest?
Entweder liegt es an mir oder du hast das Problem nicht ausreichend beschrieben
- was steht in filter.txt ?
- wellche exemplarischen %3 bekommst du ?
Gruß
LotPings

Zitat von @wtaler:
aber es kommt in den letzten Wochen folgende Übertragung für das Funknetzwerk an:
20100612030601Blech - Stokzwl
Aber deser unvollständige Eintrag würde deiner Prüfung doch standhalten?aber es kommt in den letzten Wochen folgende Übertragung für das Funknetzwerk an:
20100612030601Blech - Stokzwl
Wäre es nicht sinnvoller die Striktur nach Länge Anzahl Elementen auf vollständigkeit zu testen?
20100612030607Blech - Stopa Lager - Platz 12 - Ist 0,7 kg - Soll1,8 kg
Am Anfang ein DatumUhrzeit String undtrennen an den " - " und prüfen ob in den Teilen jeweils Lager/Platz/Soll/Ist/kg vorkommt?
Gruß
LotPings
Hallo Christoph,
dass man aus Daten, wie
20100612030601Bl[ef)e
20100612030607B
das Wort Blech ganz sicher nicht wiedererkennen kann ist doch klar. Die Frage ist doch erst einmal
-Was soll mit solchen Daten überhaupt passieren?
-Gibt es andere Kriterien (zb Zeitstempel oder Mindestlänge des Datensatzes) nach denen eine (Vor-)Auswahl getroffen werden könnte?
Grüße
rubberman
PS: Eigentlich noch wichtiger ist die Frage: Was kannst du technisch tun, um das Verstümmeln der Datensätze in Zukunft zu vermeiden.
dass man aus Daten, wie
20100612030601Bl[ef)e
20100612030607B
das Wort Blech ganz sicher nicht wiedererkennen kann ist doch klar. Die Frage ist doch erst einmal
-Was soll mit solchen Daten überhaupt passieren?
-Gibt es andere Kriterien (zb Zeitstempel oder Mindestlänge des Datensatzes) nach denen eine (Vor-)Auswahl getroffen werden könnte?
Grüße
rubberman
PS: Eigentlich noch wichtiger ist die Frage: Was kannst du technisch tun, um das Verstümmeln der Datensätze in Zukunft zu vermeiden.
Hi wtaler,
wenn Du die Zeile 2
folgendermaßen schreibst (ein Zusätzliches Leerzeichen nach dem ECHO):
Und in Deine Filter.TXT an jedem Zeilenanfang ein Leerzeichen setzt (zB. mit dieser KommandoZeile)
dann werden zumindest solche Zeilen:
es kann natürlich sein, dass Du nach Zahlen in der "filter.txt" suchst. vllt sind diese der Übeltäter zB.:
Gruß Phil
wenn Du die Zeile 2
echo %~3|findstr /g:c:\filter.txt>null || goto weiter
folgendermaßen schreibst (ein Zusätzliches Leerzeichen nach dem ECHO):
echo %~3|findstr /g:c:\filter.txt>null || goto weiter
Und in Deine Filter.TXT an jedem Zeilenanfang ein Leerzeichen setzt (zB. mit dieser KommandoZeile)
(for /f "tokens=*" %i in (c:\filter.txt) do echo %i>>"%temp%\filter) &move /y "temp%\filter" c:\filter.txt
dann werden zumindest solche Zeilen:
20100612030607Blech - Stopa Lager - Platz 12 - Ist 0,7 kg - Soll1,8 kg
NICHT mitaufgenommen!es kann natürlich sein, dass Du nach Zahlen in der "filter.txt" suchst. vllt sind diese der Übeltäter zB.:
006
diese gibt Dir auch eine Erfolgsmeldung vom FindStr aus20100612030607
Gruß Phil
Hallo Christoph,
Dann mach doch wenn Du bei jeden GUTEN Datensatz am Zeilenende [NULL] stehen hast anstatt nach Blech laut der filter.txt zu suchen
oder sonst machst Du
vllt ist Die Umleitung ins Bodenlose (>nul) schuld obwohl ja keine Befehlsverkettungszeichen in "3~%" stehen???
aber eine 2 am ende von echo "3~%" geht schonmal schief.....
was passiert denn mit
bei Zeile 3,4 und 5 kannst Du andersherum schreiben.
Gruß Phil
Dann mach doch wenn Du bei jeden GUTEN Datensatz am Zeilenende [NULL] stehen hast anstatt nach Blech laut der filter.txt zu suchen
set "Zeile=%~3"
if not "%Zeile:~-6%" == "[NULL]" goto :weiter
oder sonst machst Du
(echo %~3|findstr /g:c:\filter.txt>nul || echo %~3|findstr /e "NULL] DC]">nul)||goto :weiter
vllt ist Die Umleitung ins Bodenlose (>nul) schuld obwohl ja keine Befehlsverkettungszeichen in "3~%" stehen???
aber eine 2 am ende von echo "3~%" geht schonmal schief.....
was passiert denn mit
Sta[17HG][FF][DC]
kommt das auch in die Mail?bei Zeile 3,4 und 5 kannst Du andersherum schreiben.
>>c:\subject.txt echo %4
>>c:\mailinhalt.txt echo %3
>>c:\mailinhalt.txt type c:\a*.txt
>>c:\mailinhalt.txt echo %3
>>c:\mailinhalt.txt type c:\a*.txt
Gruß Phil
Hallo Christoph,
ich fasse es nochmal zusammen, so wie ich es Verstanden habe
wenn dem so ist würde die Batch so funktionieren:
da ja die Textdatei(en) beginnend mit a auf Laufwerk C:\ in beiden Szenarien gelöscht werden, kann dies auch zum Ende der Batch erfolgen.
Bitte fasse Deinen Code aus dem FrageBeitrag in Formatierungen in den Beiträgen.
(davor ein <code> und dahinter ein </code> setzen)
Gruß Phil
ich fasse es nochmal zusammen, so wie ich es Verstanden habe
- Die Maschinen geben Meldungen aus, welche verwertbar sind oder Nicht verwertbar sind.
- Ob eine Meldung verwertbar ist wird über den dritten Parameter der BatchDatei Abgefragt/Überprüft.
- Eine Verwertbare MaschinenMeldung beinhaltet am Ende vom dritten Parameter ein [NULL]
- Eine nicht verwertbare MaschinenMeldung wird nicht verabeitet/ge-mailt und die Batch wird beendet.
- Wenn die MaschinenMeldung verwertbar ist.
- Wird ein vierter Parameter in eine TextDatei subject.txt auf Laufwerk C:\ eingetragen,
- Der dritte Parameter der MaschinenMeldung wird in eine mailinhalt.txt auf dem Laufwerk C:\ eingetragen,
- Der Inhalt der/aller TextDatei(en) welche mit a beginnen und auf Laufwerk C:\ liegen werden in die mailinhalt.txt auf Laufwerk C:\ eingetragen.
- Alle TextDatei(en) welche mit a beginnen und auf Laufwerk C:\ liegen werden gelöscht.
- Die Mail wird versendet und subject.txt sowie mailinhalt.txt auf Laufwerk C:\ werden gelöscht.
- Wenn die MaschinenMeldung Nicht verwertbar ist.
- Alle TextDatei(en) welche mit a beginnen und auf Laufwerk C:\ liegen werden gelöscht.
wenn dem so ist würde die Batch so funktionieren:
@echo off &setlocal
set "Zeile=%~3"
if not "%Zeile:~-6%" == "[NULL]" goto :weiter
chcp 1252
echo %4>>c:\subject.txt
echo %3>>c:\mailinhalt.txt
type c:\a*.txt>>c:\mailinhalt.txt
ping -n 8 localhost>nul
<hier beginnt der Mailversand, der auf funktioniert >
del c:\subject.txt
del c:\mailinhalt.txt
:weiter
del c:\a*.txt
da ja die Textdatei(en) beginnend mit a auf Laufwerk C:\ in beiden Szenarien gelöscht werden, kann dies auch zum Ende der Batch erfolgen.
Bitte fasse Deinen Code aus dem FrageBeitrag in Formatierungen in den Beiträgen.
(davor ein <code> und dahinter ein </code> setzen)
Gruß Phil
... Aber wie kann ich den Befehl
in die IF-Abfrage einbauen ...
einfach nach der dritten Zeile Einfügenachso: nul mit nur einem L
@echo off &setlocal
set "Zeile=%~3"
if not "%Zeile:~-6%" == "[NULL]" goto :weiter
echo %~3|findstr /g:c:\filter.txt>nul || goto :weiter
chcp 1252
echo %4>>c:\subject.txt
echo %3>>c:\mailinhalt.txt
type c:\a*.txt>>c:\mailinhalt.txt
ping -n 8 localhost>nul
<hier beginnt der Mailversand, der auf funktioniert >
del c:\subject.txt
del c:\mailinhalt.txt
del c:\a*.txt
:weiter
... dass die Dateien a*.txt nicht gelöscht werden, wenn der Befehl
if not "%Zeile:~-6%" == "[NULL]" goto :weiter ...
Es wird doch erst a*.txt in mailinhalt.txt geschrieben und danach erst gelöscht!if not "%Zeile:~-6%" == "[NULL]" goto :weiter ...
ich dachte die a*.txt würden nur in die Mail geschrieben werden, wenn das ganze gedöns Brauchbar ist.
laut Deiner 1. Batch wird das doch auch gelöscht: einmal nach eintrag in mailinhalt.txt und als Alternative wenn die Meldungen aus %~3 Abfall ist (nach :weiter)
Verwirrt mich jetzt doch ein bisschen wann soll denn nun die a*.txt gelöscht werden
Vllt erklärst Du nochmal genau was die Batch wann machen soll Klammer-auf so wie ich Hier mit Stichpunkten Klammer-zu
Gruß Phil
Moin Christoph,
"%Zeile:~-6%"
~= Zeige mir nur die Anzahl Zeichen der Variable Zeile
- = zähle von hinten nach vorn
6= zähle sechs Zeichen ab
steht also für: zeige die letzten sechs Zeichen der Variable Zeile
hier ist nochmal Dein geänderter Batch
Gruß Phil
"%Zeile:~-6%"
~= Zeige mir nur die Anzahl Zeichen der Variable Zeile
- = zähle von hinten nach vorn
6= zähle sechs Zeichen ab
steht also für: zeige die letzten sechs Zeichen der Variable Zeile
hier ist nochmal Dein geänderter Batch
@echo off &setlocal
set "Zeile=%~3"
::in der naechsten Zeile wird auf eine Vollstaendige MaschinenMeldung geprueft
::wenn die letzten 6 Zeichen der Meldung nicht [NULL] sind, wird nur die Batch beendet (a*.txt bleiben erhalten).
if not "%Zeile:~-6%" == "[NULL]" goto :eof
::in der naechsten Zeile wird die Vollstaendige MaschinenMeldung auf Uebereinstimmung von Zeichenfolgen aus der filter.txt geprueft
::wenn keine Zeichenfolge der filter.txt in der Meldung vorkommt, wird zur Sprungmarke :Weiter gegangen.
echo %~3|findstr /g:c:\filter.txt>nul || goto :weiter
chcp 1252
echo %4>>c:\subject.txt
echo %3>>c:\mailinhalt.txt
type c:\a*.txt>>c:\mailinhalt.txt
ping -n 8 localhost>nul
<hier beginnt der Mailversand, der auf funktioniert >
del c:\subject.txt
del c:\mailinhalt.txt
:weiter
::Nur wenn -
::A: die Meldung keine Zeichenfolge aus der filter.txt beinhaltet hat, wird a*.txt geloescht!
::B: es zum Versandt der Mail kam, wird a*.txt geloescht!
del c:\a*.txt
Gruß Phil