Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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?

Frage Entwicklung Batch & Shell

Mitglied: takitano

takitano (Level 1) - Jetzt verbinden

09.09.2010, aktualisiert 14:45 Uhr, 5698 Aufrufe, 20 Kommentare

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

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
Mitglied: 76109
09.09.2010 um 14:02 Uhr
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:
01.
Const FolderPath = "E:\Test" 
02.
 
03.
Dim Fso, File, ImportFile, ExportFile, Text, StartZeile, HashValue, i 
04.
     
05.
Set Fso = CreateObject("Scripting.FileSystemObject") 
06.
     
07.
For Each File In Fso.GetFolder(FolderPath).Files 
08.
    If LCase(Fso.GetExtensionName(File)) = "txt" Then 
09.
        Set ImportFile = Fso.OpenTextFile(File.Path) 
10.
             
11.
        Text = Split(ImportFile.ReadAll, vbCrLf):  ImportFile.Close 
12.
             
13.
        For i = 0 To UBound(Text) 
14.
            If InStr(1, Text(i), "MD5", vbTextCompare) > 0 Then StartZeile = i + 1: Exit For 
15.
        Next 
16.
             
17.
        If i <= UBound(Text) Then 
18.
            Set ExportFile = Fso.CreateTextFile(File.Path) 
19.
                 
20.
            ExportFile.WriteLine "MD5" 
21.
                 
22.
            For i = StartZeile To UBound(Text) 
23.
                If Text(i) <> "" Then 
24.
                    HashValue = Split(Text(i), ";")(0) 
25.
                    If IsNumeric("&H" & Left(HashValue, 8)) Then ExportFile.WriteLine HashValue 
26.
                End If 
27.
            Next 
28.
             
29.
            ExportFile.Close 
30.
        End If 
31.
    End If 
32.
Next
Wobei alle *.txt-Dateien überschrieben werden, die den Bezeichner "MD5" enthalten

Gruß Dieter

[edit] geändert [/edit]
Bitte warten ..
Mitglied: takitano
09.09.2010 um 14:17 Uhr
Danke Dieter! Ich teste dein Script aus!

PS: dieser Hash-Wert wurde von mir aus 2 Datei genommen. Nicht relevant!
Bitte warten ..
Mitglied: takitano
09.09.2010 um 14:27 Uhr
Es hat FAST geklappt...
Wie kann man aber in der 7 Zeile vorhandene MD5-Überschrift lassen?
Bitte warten ..
Mitglied: 76109
09.09.2010 um 15:10 Uhr
Hallo takitano!

Code oben geändert

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
Bitte warten ..
Mitglied: bastla
09.09.2010 um 16:54 Uhr
Hallo takitano und willkommen im Forum!

Für den Fall, dass Dich die Batch-Lösung noch interessiert , ein ungetester Vorschlag:
01.
@echo off & setlocal 
02.
set "Verzeichnis=D:\Das mit den Hashes" 
03.
 
04.
pushd "%Verzeichnis%" 
05.
set "HT=%temp%\HashTemp.tmp" 
06.
for /f "delims=" %%i in ('findstr /m "MD5" *.txt') do ( 
07.
    move "%%i" "%HT%"  
08.
    for /f "usebackq skip=6 delims=;" %%a in ("%HT%") do >>"%%i" echo %%a 
09.
10.
del "%HT%" 
11.
popd
Grüße
bastla
Bitte warten ..
Mitglied: takitano
10.09.2010 um 13:47 Uhr
Herzlichen Dank an Dieter und bastla! Alles läuft prima.
Bitte warten ..
Mitglied: takitano
03.08.2011 um 10:26 Uhr
Zitat von bastla:
Hallo takitano und willkommen im Forum!

Für den Fall, dass Dich die Batch-Lösung noch interessiert , ein ungetester Vorschlag:
01.
@echo off & setlocal 
02.
> set "Verzeichnis=D:\Das mit den Hashes" 
03.
>  
04.
> pushd "%Verzeichnis%" 
05.
> set "HT=%temp%\HashTemp.tmp" 
06.
> for /f "delims=" %%i in ('findstr /m "MD5" *.txt') do ( 
07.
>     move "%%i" "%HT%"  
08.
>     for /f "usebackq skip=6 delims=;" %%a in ("%HT%") do >>"%%i" echo %%a 
09.
> ) 
10.
> del "%HT%" 
11.
> popd 
12.
> 
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?
Bitte warten ..
Mitglied: bastla
03.08.2011 um 11:11 Uhr
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:
01.
Const FolderPath = "E:\Test" 
02.
Set Fso = CreateObject("Scripting.FileSystemObject") 
03.
For Each File In Fso.GetFolder(FolderPath).Files 
04.
    If LCase(Fso.GetExtensionName(File)) = "txt" Then 
05.
        Text = Split(Fso.OpenTextFile(File.Path).ReadAll, vbCrLf) 
06.
        For i = 0 To UBound(Text) 
07.
            If InStr(1, Text(i), "MD5", vbTextCompare) > 0 Then StartZeile = i + 1: Exit For 
08.
        Next 
09.
        If i <= UBound(Text) Then 
10.
            TextNew = "MD5" 
11.
            For i = StartZeile To UBound(Text) 
12.
                If Text(i) <> "" Then 
13.
                    HashValue = Split(Text(i), ";")(0) 
14.
                    If IsNumeric("&H" & Left(HashValue, 8)) Then TextNew = TextNew & vbCrLf & HashValue 
15.
                End If 
16.
            Next 
17.
            Fso.CreateTextFile(File.Path).Write TextNew 
18.
        End If 
19.
    End If 
20.
Next
Grüße
basta
Bitte warten ..
Mitglied: takitano
03.08.2011 um 11:25 Uhr
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.
Bitte warten ..
Mitglied: bastla
03.08.2011 um 11:32 Uhr
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:
01.
Const FolderPath = "E:\Test" 
02.
Set Fso = CreateObject("Scripting.FileSystemObject") 
03.
For Each File In Fso.GetFolder(FolderPath).Files 
04.
    If LCase(Fso.GetExtensionName(File)) = "txt" Then 
05.
        Text = Split(Fso.OpenTextFile(File.Path).ReadAll, vbCrLf) 
06.
        TextNew = "MD5" 
07.
        For i = 6 To UBound(Text) 'Zeilen 0 bis 5 überspringen 
08.
            If Text(i) <> "" Then 
09.
                HashValue = Split(Text(i), ";")(0) 
10.
                If IsNumeric("&H" & Left(HashValue, 8)) Then TextNew = TextNew & vbCrLf & HashValue 
11.
            End If 
12.
        Next 
13.
        Fso.CreateTextFile(File.Path).Write TextNew 
14.
    End If 
15.
Next
Grüße
bastla
Bitte warten ..
Mitglied: takitano
03.08.2011 um 11:51 Uhr
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
Bitte warten ..
Mitglied: bastla
03.08.2011 um 12:05 Uhr
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:
01.
@echo off & setlocal 
02.
set "Verzeichnis=E:\Test" 
03.
 
04.
set "R=%temp%\RemoveCrLf.vbs" 
05.
>%R%  echo F=WScript.Arguments(0):Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile(F).ReadAll 
06.
>>%R% echo If Right(T,2)=vbCrLf Then fso.CreateTextFile(F).Write Left(T,Len(T)-2) 
07.
 
08.
pushd "%Verzeichnis%" 
09.
for /f "delims=" %%i in ('dir /b /a-d *.txt') do cscript //nologo %R% "%%i" 
10.
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
Bitte warten ..
Mitglied: takitano
03.08.2011 um 12:07 Uhr
Die Quelle hat unser Boss geschrieben - sie zu editieren ist, leider, TABU!
Bitte warten ..
Mitglied: bastla
03.08.2011 um 12:09 Uhr
Hallo takitano!
Die Quelle hat unser Boss geschrieben
Sei Dir meines Mitgefühls gewiss ...

Grüße
bastla

P.S.: Ich habe oben noch eine Alternative angefügt ...
Bitte warten ..
Mitglied: takitano
03.08.2011 um 12:12 Uhr
Ich probiere es gleich
Bitte warten ..
Mitglied: takitano
03.08.2011 um 12:15 Uhr
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....
Bitte warten ..
Mitglied: bastla
03.08.2011 um 12:17 Uhr
Hallo takitano!

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

Grüße
bastla
Bitte warten ..
Mitglied: takitano
03.08.2011 um 12:30 Uhr
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.
Bitte warten ..
Mitglied: takitano
03.08.2011 um 12:50 Uhr
DANKE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Es hat geklappt - ich bin ein ID.... Habe zeilen 5 und 6 in deiner Batch-Datei verwechselt!!! Reif für den Insel.
Bitte warten ..
Mitglied: bastla
03.08.2011 um 13:26 Uhr
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) ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Windows Server
Verzeichnis lässt sich nicht löschen (7)

Frage von BPeter zum Thema Windows Server ...

Perl
gelöst Mit Perl aus einer Datei teilidentische Zeilen löschen (5)

Frage von Jeduja zum Thema Perl ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...