93578
Goto Top

Per Batch in jeder Textdatei in einem Verzeichnis die ersten 6 Zeilen löschen und weiter unten nur die ersten 32 Zeichen lassen und den Rest löschen?

Hallo an alle Forum-Mitglieder! Ich bin auf Euere Hilfe angewiesen, da ich von Batch-Programmierung NULL Ahnung habe. face-sad

Ich habe folgendes Problem:

unter Windows 7 Pro 64 bit habe ich einen Verzeichnis mit Textdateien (*.txt). Alle Dateien haben verschieden Namen. Jede Datei sieht aber so aus:


HASH
  1. initials=Hash-Werte
  2. date_loaded=09.09.2010
  3. vendor=FLV
  4. package=Player
  5. version=2
MD5;SHA1;SHA256;FILESIZE;FILENAME
fd5e10a01b41d295ce401bb0e7d518d6;60dbffdf811f17da46a245ec07f916473be4cc64;0144ad4a534674df6201d8f4404f4a363491bb5b067a0aea9981d0b18c65f819;192512;c:\Dokumente und Einstellungen\User\Lokale Einstellungen\Temp\mProjector1640541402\Flash6MovieV2.3.1.1hj.mvx
f6dd9db721f119e871f458733ed00eec;90acbcb0ea49b3bfad9c6f122d57b46e68222a2c;6cd061252bb6c5477600008b9281f91e79abb5f1c97bda68933ce120b300c08a;1340;c:\Dokumente und Einstellungen\User\Anwendungsdaten\Mozilla\Firefox\Profiles\4dsuauhs.default\prefs.js
f6af34a89e055619ffca9f646b9dae20;7b1a88f4962da9cc5a6b6d14c984eb0475163140;1b39bbb0f3d946f73192e01d1d18d9021df60c3c5f9e80c18802d17e57ca7174;56705;c:\Dokumente und Einstellungen\User\Anwendungsdaten\Mozilla\Firefox\Profiles\4dsuauhs.default\extensions\{635abd67-4fe9-1b23-4f01-e679fa7484c1}\components\nsYahooDomBuilder.js


usw. (es folgen weitere Hash-Werte).

Ich will nun in allen Text-Dateien in diesem Verzeichnis nur die erste 32 Zeichen (also MD5 Hash-Werte) lassen und den Rest (inklusive die ersten 6 Zeilen) löschen. In der 7 Zeile soll nur MD5 bleiben. Es soll also ungefähr so aussehen:

MD5
fd5e10a01b41d295ce401bb0e7d518d6
f6dd9db721f119e871f458733ed00eec
f6af34a89e055619ffca9f646b9dae20


Kann mir dabei jemand helfen? Danke!

Philipp

Content-Key: 150699

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

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

Mitglied: 76109
76109 Sep 09, 2010 at 12:02:47 (UTC)
Goto Top
Hallo takitano!

Für den Fall, dass Du keine Batch-Lösung bekommst, könntest Du mal dieses VB-Skript testen.

Quellcode in Datei (*.vbs) kopieren und die Ordnerpfad-Konstante entsprechend anpassen:
Const FolderPath = "E:\Test"  

Dim Fso, File, ImportFile, ExportFile, Text, StartZeile, HashValue, i
    
Set Fso = CreateObject("Scripting.FileSystemObject")  
    
For Each File In Fso.GetFolder(FolderPath).Files
    If LCase(Fso.GetExtensionName(File)) = "txt" Then  
        Set ImportFile = Fso.OpenTextFile(File.Path)
            
        Text = Split(ImportFile.ReadAll, vbCrLf):  ImportFile.Close
            
        For i = 0 To UBound(Text)
            If InStr(1, Text(i), "MD5", vbTextCompare) > 0 Then StartZeile = i + 1: Exit For  
        Next
            
        If i <= UBound(Text) Then
            Set ExportFile = Fso.CreateTextFile(File.Path)
                
            ExportFile.WriteLine "MD5"  
                
            For i = StartZeile To UBound(Text)
                If Text(i) <> "" Then  
                    HashValue = Split(Text(i), ";")(0)  
                    If IsNumeric("&H" & Left(HashValue, 8)) Then ExportFile.WriteLine HashValue  
                End If
            Next
            
            ExportFile.Close
        End If
    End If
Next
Wobei alle *.txt-Dateien überschrieben werden, die den Bezeichner "MD5" enthalten

Gruß Dieter

[edit] geändert [/edit]
Mitglied: 93578
93578 Sep 09, 2010 at 12:17:33 (UTC)
Goto Top
Danke Dieter! Ich teste dein Script aus!

PS: dieser Hash-Wert wurde von mir aus 2 Datei genommen. Nicht relevant!
Mitglied: 93578
93578 Sep 09, 2010 at 12:27:56 (UTC)
Goto Top
Es hat FAST geklappt... face-smile
Wie kann man aber in der 7 Zeile vorhandene MD5-Überschrift lassen?
Mitglied: 76109
76109 Sep 09, 2010 at 13:10:40 (UTC)
Goto Top
Hallo takitano!

Code oben geändertface-wink

Für den Fall, das der Bezeichner nicht in Zeile 7 oder an Position 1 steht, wird die Startzeile jetzt automatisch ermittelt, sofern vorhanden. Ansonsten wird die Datei übersprungen.

Gruß Dieter
Member: bastla
bastla Sep 09, 2010 at 14:54:04 (UTC)
Goto Top
Hallo takitano und willkommen im Forum!

Für den Fall, dass Dich die Batch-Lösung noch interessiert face-wink, ein ungetester Vorschlag:
@echo off & setlocal
set "Verzeichnis=D:\Das mit den Hashes"  

pushd "%Verzeichnis%"  
set "HT=%temp%\HashTemp.tmp"  
for /f "delims=" %%i in ('findstr /m "MD5" *.txt') do (  
    move "%%i" "%HT%"   
    for /f "usebackq skip=6 delims=;" %%a in ("%HT%") do >>"%%i" echo %%a  
)
del "%HT%"  
popd
Grüße
bastla
Mitglied: 93578
93578 Sep 10, 2010 at 11:47:47 (UTC)
Goto Top
Herzlichen Dank an Dieter und bastla! Alles läuft prima. face-smile
Mitglied: 93578
93578 Aug 03, 2011 at 08:26:48 (UTC)
Goto Top
Zitat von @bastla:
Hallo takitano und willkommen im Forum!

Für den Fall, dass Dich die Batch-Lösung noch interessiert face-wink, ein ungetester Vorschlag:
@echo off & setlocal
> set "Verzeichnis=D:\Das mit den Hashes"  
> 
> pushd "%Verzeichnis%"  
> set "HT=%temp%\HashTemp.tmp"  
> for /f "delims=" %%i in ('findstr /m "MD5" *.txt') do (  
>     move "%%i" "%HT%"   
>     for /f "usebackq skip=6 delims=;" %%a in ("%HT%") do >>"%%i" echo %%a  
> )
> del "%HT%"  
> popd
> 
Grüße
bastla

Hallo Bastla,
deine Lösung hat sehr lange funktioniert und ich habe kein Problem damit gehabt. Nur habe ich mein Programm upgraded und siehe da: sie mag keinen "Waagerücklauf"-Zeichen mehr, welchen diese Batch-Datei in der letzten leeren Zeile produziert. Kann man das irgendwie beseitigen?
Member: bastla
bastla Aug 03, 2011 at 09:11:25 (UTC)
Goto Top
Hallo takitano!

Mit Batch ist Dein Wunsch nicht ganz so einfach zu realisieren - versuch es eher mit der folgenden (ungetesteten) Variante von Dieters VB-Script:
Const FolderPath = "E:\Test"  
Set Fso = CreateObject("Scripting.FileSystemObject")  
For Each File In Fso.GetFolder(FolderPath).Files
    If LCase(Fso.GetExtensionName(File)) = "txt" Then  
        Text = Split(Fso.OpenTextFile(File.Path).ReadAll, vbCrLf)
        For i = 0 To UBound(Text)
            If InStr(1, Text(i), "MD5", vbTextCompare) > 0 Then StartZeile = i + 1: Exit For  
        Next
        If i <= UBound(Text) Then
            TextNew = "MD5"  
            For i = StartZeile To UBound(Text)
                If Text(i) <> "" Then  
                    HashValue = Split(Text(i), ";")(0)  
                    If IsNumeric("&H" & Left(HashValue, 8)) Then TextNew = TextNew & vbCrLf & HashValue  
                End If
            Next
            Fso.CreateTextFile(File.Path).Write TextNew
        End If
    End If
Next
Grüße
basta
Mitglied: 93578
93578 Aug 03, 2011 at 09:25:45 (UTC)
Goto Top
Leider er läuft nicht 100% - von 5 Dateien wird eine immer falsch berechnet und fast vollständig gelöscht. Es bleiben nur die ersten 2 Zeilen. Dafür gibt's tatsächlich keinen Waagerücklauf mehr. face-smile face-sad
Member: bastla
bastla Aug 03, 2011 at 09:32:52 (UTC)
Goto Top
Hallo takitano!

Hat die "Eine" irgend eine Besonderheit? Ist, wenn Du versuchsweise die Dateien in unterschiedlicher Reihenfolge in den Testordner kopierst, immer die gleiche Datei betroffen?

Als Alternative noch eine Variante, bei welcher die ersten 6 Zeilen ohne Rücksicht auf den Inhalt übersprungen werden:
Const FolderPath = "E:\Test"  
Set Fso = CreateObject("Scripting.FileSystemObject")  
For Each File In Fso.GetFolder(FolderPath).Files
    If LCase(Fso.GetExtensionName(File)) = "txt" Then  
        Text = Split(Fso.OpenTextFile(File.Path).ReadAll, vbCrLf)
        TextNew = "MD5"  
        For i = 6 To UBound(Text) 'Zeilen 0 bis 5 überspringen  
            If Text(i) <> "" Then  
                HashValue = Split(Text(i), ";")(0)  
                If IsNumeric("&H" & Left(HashValue, 8)) Then TextNew = TextNew & vbCrLf & HashValue  
            End If
        Next
        Fso.CreateTextFile(File.Path).Write TextNew
    End If
Next
Grüße
bastla
Mitglied: 93578
93578 Aug 03, 2011 at 09:51:32 (UTC)
Goto Top
Das gleiche Ergebnis. Ich habe mich falsch ausgedruckt: die ersten 6 Zeilen werden korrekt gelöscht, aber dann bleiben nur die 7 und die 8 Zeilen und alle anderen ab 9 Zeile werden gelöscht. Das betrifft nur diese einzelne Datei. Da ich aber ganze Menge von Dateien habe (bis 100-150 meistens) kann ich nicht jede von diesen Dateien manuell überprüfen. Dein Batch bearbeitet aber ALLE Dateien korrekt. Nur das Problem mit diesem Waagenrücklauf... Kann sein das da eine neue Batch-datei eingesetzt werden muss (nur um diesen Waagenrücklauf in allen 100-150 Dateien innerhalb eines Ordners zu überprüfen und diese Zeile (mit Waagenrücklauf - also ^Z-Zeichen) komplett entfernen???

PS: Ich weiß es nicht ob es tatsächlich eine Waagerücklaufzeichen ist. Im Textedit sieht es so aus:

tegdhdfhfhjfhjfjh
dfghfhjnfgnjgnh
fghfjnmgfnjgnm
<-

Im Creameditor::

tegdhdfhfhjfhjfjh
dfghfhjnfgnjgnh
fghfjnmgfnjgnm
^Z
Member: bastla
bastla Aug 03, 2011 at 10:05:21 (UTC)
Goto Top
Hallo takitano!
Das betrifft nur diese einzelne Datei.
Es würde mich stören, wenn ich an sich gleich stukturierte Dateien erwarte, aber die eine (und vielleicht auch andere) aus der Reihe tanzt - insofern solltest Du vielleicht an der Quelle ansetzen ...

Nixdestrotrotz: Ein Batch, der aus allen Textdateien die abschließende Zeilenschaltung entfernt, könnte (schon wieder ungetestet) etwa so aussehen:
@echo off & setlocal
set "Verzeichnis=E:\Test"  

set "R=%temp%\RemoveCrLf.vbs"  
>%R%  echo F=WScript.Arguments(0):Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile(F).ReadAll  
>>%R% echo If Right(T,2)=vbCrLf Then fso.CreateTextFile(F).Write Left(T,Len(T)-2)

pushd "%Verzeichnis%"  
for /f "delims=" %%i in ('dir /b /a-d *.txt') do cscript //nologo %R% "%%i"  
popd
[Edit]
Ich war von einer "normalen" Zeilenschaltung ausgegangen - sollte sich das Problem tatsächlich aus dem "^Z" ergeben, müsste die Zeile 5 6 eher
>>%R% echo If Right(T,1)=Chr(26) Then fso.CreateTextFile(F).Write Left(T,Len(T)-1)
lauten.
[/Edit]

Grüße
bastla
Mitglied: 93578
93578 Aug 03, 2011 at 10:07:26 (UTC)
Goto Top
Die Quelle hat unser Boss geschrieben - sie zu editieren ist, leider, TABU! face-wink
Member: bastla
bastla Aug 03, 2011 at 10:09:26 (UTC)
Goto Top
Hallo takitano!
Die Quelle hat unser Boss geschrieben
Sei Dir meines Mitgefühls gewiss ... face-wink

Grüße
bastla

P.S.: Ich habe oben noch eine Alternative angefügt ...
Mitglied: 93578
93578 Aug 03, 2011 at 10:12:13 (UTC)
Goto Top
Ich probiere es gleich
Mitglied: 93578
93578 Aug 03, 2011 at 10:15:18 (UTC)
Goto Top
Es bleibt:

sgdfghddhgdfg
dfgbdbgfbgfb
fgbfbfbfgbfbgfb
fbgfbngfbngng
->

Im Grunde brauche ich nur diese Umbruchszeile mit diesem Zechen löschen. Dann ist das Programm zufrieden. Aber manuell 100 Dateien öffnen und editieren....
Member: bastla
bastla Aug 03, 2011 at 10:17:54 (UTC)
Goto Top
Hallo takitano!

Schau doch mal per Hex-Editor nach, welches Zeichen genau (ASCII-/ANSI-Wert) denn nun das Problem darstellt ...

Grüße
bastla
Mitglied: 93578
93578 Aug 03, 2011 at 10:30:26 (UTC)
Goto Top
0D 0A 1A 0D 0A- steht dort. Also hadelt es sich um SUB. Es soll bleiben nur 0D 0A dann funktioniert. SUB (^Z) muss weg. Codierung ist Latin1.
Mitglied: 93578
93578 Aug 03, 2011 at 10:50:42 (UTC)
Goto Top
DANKE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Es hat geklappt - ich bin ein ID.... Habe zeilen 5 und 6 in deiner Batch-Datei verwechselt!!! Reif für den Insel. face-sad
Member: bastla
bastla Aug 03, 2011 at 11:26:06 (UTC)
Goto Top
Hallo takitano!

"Die Insel" wird auch überbewertet - ich war erst neulich dort und habe trotzdem selbst für die Verwechslung gesorgt ("Zeile 5" geschrieben und "Zeile 6" gemeint) ... face-wink

Grüße
bastla