burningfire
Goto Top

Ersten 32 bytes mehrerer binär-dateien mit batch oder vbs löschen

Ersten 32 bytes mehrerer binär-dateien mit batch oder vbs löschen...

Hallo,
ich möchte aus mehreren binär Dateien, die in einem ordner sind, die ersten 32 Bytes löschen (Dateiheader entfernen) und das resultat im unterordner "Conv" in einer neuen datei mit neuer dateiendung (.dds) speichern.
Die orginal dateierweiterung ist ".xbt".
Die dateinamen sollen erhalten bleiben (bis eben auf die dateiendung).

Danke.

MfG BuRnInGfIrE

Content-Key: 141347

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

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

Member: bastla
bastla Apr 23, 2010, updated at Oct 18, 2012 at 16:41:51 (UTC)
Goto Top
Hallo BuRnInGfIrE und willkommen im Forum!

Obwohl VBS nicht (und Batch schon überhaupt nicht) zur Verarbeitung von Binärdateien gedacht ist, sollte sich das Entfernen des Headers auf Basis einer hier von didi1954 gezeigten Methode etwa so lösen lassen:
SourcePath = "D:\Test"  
SourceExt = "xbt"  
Skip = 32
TargetPath = "D:\Test\Convert"  
TargetExt = "dds"  

Set Fso = CreateObject("Scripting.FileSystemObject")  
If Not Fso.FolderExists(TargetPath) Then Fso.CreateFolder(TargetPath)

For Each File In Fso.GetFolder(SourcePath).Files
    If LCase(Fso.GetExtensionName(File.Name)) = SourceExt Then
        Set BinFile = File.OpenAsTextStream
        i = 1
        BinText = ""  
        Do Until BinFile.AtEndOfStream
            c = BinFile.Read(1)
            If i > Skip Then BinText = BinText & c
            i = i + 1
        Loop
        BinFile.Close
    
        Set BinFile = Fso.CreateTextFile(TargetPath & "\" & Fso.GetBaseName(File.Name) & "." & TargetExt)  
        For i = 1 To Len(BinText)
             BinFile.Write Mid(BinText, i, 1)
        Next
        BinFile.Close        
    End If
Next
MsgBox "Done."  
Falls der Zielordner noch nicht existiert, wird dieser erstellt.
Im Zielordner ev bereits vorhandene gleichnamige Dateien werden ohne Rückfrage überschrieben.

Grüße
bastla
Member: BuRnInGfIrE
BuRnInGfIrE Apr 23, 2010 at 22:34:35 (UTC)
Goto Top
WOW!!!

Das ging ja fix, Lob.

Dieser VBS-skript funktioniert bestens, Danke.

MfG BuRnInGfIrE
Member: bastla
bastla Apr 23, 2010 at 22:40:34 (UTC)
Goto Top
Hallo BuRnInGfIrE!

Freut mich, wenn's passt. face-smile

Das Lob steht aber auf jeden Fall didi1954 zu ...

Grüße
bastla
Mitglied: 77559
77559 Apr 23, 2010 at 23:49:15 (UTC)
Goto Top
Hallo bastla,
Zitat von @bastla:
Obwohl VBS nicht (und Batch schon überhaupt nicht) zur Verarbeitung von Binärdateien gedacht ist,
Es gibt aber durchaus Techniken zum Umgehen dieser VBS-Beschränkung.

Rest des Beitrags wegen Problemen und zu später Uhrzeit zurückgezogen face-sad.

Gute Nacht
LotPings
Member: bastla
bastla Apr 24, 2010 at 07:09:18 (UTC)
Goto Top
Hallo LotPings!

Die auf der von Dir verlinkten Seite Work with binary files in VBSscript - read and write local and remote files beschriebenen Techniken waren alle schon da, als ich etwa 2006 zum letzten Mal intensiver nach entsprechenden Möglichkeiten gesucht habe - aber es sind, wie Du richtig schreibst, eben nur Ansätze zum "Umgehen dieser VBS-Beschränkung". Ob sich daraus (oder aus einem der 2, 3 weiteren Vorschläge, die ich damals gefunden und mittlerweile schon [Edit] fast: Eric Lippert: Binary Files and the File System Object Do Not Mix [/Edit] wieder verdrängt habe face-wink) - vermutlich - etwas Perfomanteres basteln lässt, wäre zu testen (wobei wir aber noch nicht einmal wissen, wie groß die zu konvertierenden "xbt"-Dateien sind bzw ob dringender Optimierungsbedarf besteht) ...

Grüße
bastla
Member: BuRnInGfIrE
BuRnInGfIrE Apr 24, 2010 at 08:19:51 (UTC)
Goto Top
@bastla:

Die xbt Dateien sind zwichen 2 und ~256 kb gross.

Und das entfernen der ersten 32 byte ist in der Tat seeeehhhhr langsam, aber es geht.
Mitglied: 77559
77559 Apr 24, 2010 at 08:28:17 (UTC)
Goto Top
Ja du hast ja Recht,
ich habe mir da gestern lange die Zähne dran ausgebissen und dachte das es per Ein-/Ausgabeumleitung funktionieren würde. Das tat es mit Testdaten mit allen möglichen Bytes auch, aber weitere Tests mit größeren Dateilängen ergaben dann ein inakzeptables "funktioniert nur manchmal".

Defekte Lösung gelöscht.

Gruß
LotPings
Member: BuRnInGfIrE
BuRnInGfIrE Apr 24, 2010 at 09:10:16 (UTC)
Goto Top
Die oben gezeigte Stapelverarbeitung geht nicht so richtig.
Die ersten 32 byte scheinen zwar entfernt zu werden aber die ausgabedatei ist nicht mehr zu gebrauchen?!
bisher ist der VB-skript die beste lösung.

Zu den VB-Skript:

Gibt es eine möglichkeit sowas wie ein fortschrittsbalken oder so änlich, was zeigt wie weit er ist, anzuzeigen?

Danke.
Mitglied: 77559
77559 Apr 24, 2010 at 10:19:01 (UTC)
Goto Top
Zitat von @BuRnInGfIrE:
Gibt es eine möglichkeit sowas wie ein fortschrittsbalken oder so änlich, was zeigt wie weit er ist, anzuzeigen?
Es gibt dafür zwar auch Techniken, aber eine Beschleunigung hilft dir vielleicht eher weiter.
Wenn du dieses Variante mit Cscript ausführst, wird die aktuelle Datei angezeigt.
Durch das direkte Schreiben der eingelesenen Bytes sollte es etwas schneller sein als die Version die die ganze Datei einliest und dann erst schreibt.

ForceCscript ' Diese Zeile NICHT weglassen, sonst wird die Subroutine ForceCscript nicht aufgerufen ;-)  
SourcePath = "D:\Test"  
SourceExt = "xbt"  
Skip = 32
TargetPath = "D:\Test\Convert"  
TargetExt = "dds"  

Set Fso = CreateObject("Scripting.FileSystemObject")  
If Not Fso.FolderExists(TargetPath) Then Fso.CreateFolder(TargetPath)

For Each File In Fso.GetFolder(SourcePath).Files
    If LCase(Fso.GetExtensionName(File.Name)) = SourceExt Then
        Set BinFileIn = File.OpenAsTextStream
        Set BinFileOut = Fso.CreateTextFile(TargetPath & "\" & Fso.GetBaseName(File.Name) & "." & TargetExt)  
	wscript.echo "Verarbeite: " & File  
        i = 1
        Do Until BinFileIn.AtEndOfStream
            c = BinFileIn.Read(1)
            If i > Skip Then BinFileOut.Write c
            i = i + 1
        Loop
        BinFileIn.Close
        BinFileOut.Close        
    End If
Next
Wscript.Echo "Fertig, zum Fortfahren Enter drücken."  
WScript.StdIn.ReadLine()

Sub ForceCscript
  If (right(Ucase(WScript.FullName),11)="WSCRIPT.EXE") Then  
    Dim WshShell,args,objArgs,I
    Set WshShell = CreateObject("WScript.Shell")  
    WshShell.Run WshShell.ExpandEnvironmentStrings("%COMSPEC%") & _  
    " /C cscript.exe """ & Wscript.ScriptFullName & """" ,1,False  
    Set WshShell = Nothing
   WScript.Quit
  End If
End Sub

Gruß
LotPings

Edit: ForceCscript und Wscript.Echo eingebaut
Member: BuRnInGfIrE
BuRnInGfIrE Apr 24, 2010 at 10:40:13 (UTC)
Goto Top
Cool, Danke sehr.

Die nzeige der gerade zu verarbeitenden Datei ist auch ne lösung.
Mann darf den Skript bloß nicht direkt starten, da mann sich sonst tot "OK" klickt. face-smile
Ich verwende deshalt eine Start-CMD datei.

Die verarbeitungsgeschwindigkeit ist nun auch akzeptapel.

Eine frage noch:

Wie bekommt mann die "Done" meldung nach abschluss der Dateioperationen auch in das CMD-Fenster.
Ich würde dann am ende der CMD-Datei noch mit "PAUSE" unterbrechen.

MfG BuRnInGfIrE
Mitglied: 77559
77559 Apr 24, 2010 at 11:08:45 (UTC)
Goto Top
Hallo,
habe beide Anforderungen direkt eingebaut,
das script prüft ob es mit wscript gestartet wurde und wenn ja startet es sich selbst nochmal mit cscript;
also keine Batch zum Starten mehr nötig.

Gruß
LotPings
Mitglied: 76109
76109 Apr 24, 2010 at 11:09:56 (UTC)
Goto Top
Hallo zusammen!

Anhand von bastlas Quellcode und LotPings gepostetem Link, habe ich die Funktion mal an die Bedürfnisse von BuRnInGfIrE angepasst und der ganze Ablauf sollte um ein vielfaches schneller von statten gehen.

Const SourcePath = "D:\Test"  
Const SourceExt = "xbt"  
Const TargetPath = "D:\Test\Convert"  
Const TargetExt = "dds"  

Const Skip = 32
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2

Dim Fso, File, BinaryStream, ByteArray, NewFile

Set Fso = CreateObject("Scripting.FileSystemObject")  
Set BinaryStream = CreateObject("ADODB.Stream")  

If Not Fso.FolderExists(TargetPath) Then Fso.CreateFolder (TargetPath)

For Each File In Fso.GetFolder(SourcePath).Files
    If LCase(Fso.GetExtensionName(File.Name)) = SourceExt Then

        WScript.Echo "Verarbeite: " & File   
        
        With BinaryStream
            .Type = adTypeBinary
            .Open
            .LoadFromFile File.Path
            .Position = Skip
             ByteArray = .Read(.Size - Skip)
            .Close
        End With
    
        NewFile = TargetPath & "\" & Fso.GetBaseName(File.Name) & "." & TargetExt  
        
        With BinaryStream
            .Type = adTypeBinary
            .Open
            .Write ByteArray
            .SaveToFile NewFile, adSaveCreateOverWrite
            .Close
        End With
    End If
Next

WScript.Echo "Done."  

@bastla
Danke für Verwendung meines Codeschnipsels und die Lobesweiterreichungface-smile

Gruß Dieter

PS. Und eigentlich habe ich wegen Umzugsvorbereitungen überhaupt keine Zeitface-wink
Mitglied: 77559
77559 Apr 24, 2010 at 11:23:44 (UTC)
Goto Top
Hallo Dieter,

sieht gut aus, kann es leider nicht testen weil mein Avira da ein
"HTML/ADODB.Exploit.Gen"
fehlerkennt. face-sad

Gruß
LotPings
Mitglied: 76109
76109 Apr 24, 2010 at 11:31:32 (UTC)
Goto Top
Hallo LotPings!

Ich nutze das Antivirus aus der gelben Schachtel und der gibt mir keine derartige Meldung? face-sad

Gruß Dieter
Member: BuRnInGfIrE
BuRnInGfIrE Apr 24, 2010 at 11:48:46 (UTC)
Goto Top
Bei mir startet (wenn ich es ohne CMD-datei starte) mit WScript und nicht mit CSkript.
Er zeigt bei mir auch immer alle dateien in einem Windows-OK Fenster an.?
Wenn es hilft, ich verwende eine X64-Windows umgebung mit Server 2k3.

@76109:

WOW nun rennt das teil ja so richtig mit lichtgeschwindigkeit face-smile .
Super Arbeit - Lob.

Nun wäre ich noch an einer kombi der beiden Skripte interressiert.
Das skript von LotPings mit der "CSkript.exe" abfrage kombiniert mit der geschwindigkeit vom Skript von didi1954.

Danke.
Mitglied: 77559
77559 Apr 24, 2010 at 12:13:32 (UTC)
Goto Top
Zitat von @BuRnInGfIrE:
Bei mir startet (wenn ich es ohne CMD-datei starte) mit WScript und nicht mit CSkript.
Er zeigt bei mir auch immer alle dateien in einem Windows-OK Fenster an.?
Wenn es hilft, ich verwende eine X64-Windows umgebung mit Server 2k3.
Habe das hier unter Win7-64bit geschrieben und auch auf XP-ProSP3 getestet - seltsam.

@76109:
WOW nun rennt das teil ja so richtig mit lichtgeschwindigkeit face-smile .
Super Arbeit - Lob.

Schließe mich da an, auf meinem XP-Rechner läufts (auch mit Avira aber ohne Fehlalarm)

Dann weiterhin erfolgreiche Umzugsvorereitungen.

Gruß
LotPings
Member: Biber
Biber Apr 24, 2010 at 13:51:14 (UTC)
Goto Top
Moin alle,

wenn denn VBScript auf diesem Rechner von diesem Benutzer nur für diese eine Aufgabe benutzt wird (zumindest die nächsten paar halben Stunden...
> cscript //H:cscript //nologo /s
Befehlszeilenoptionen wurden gespeichert.
Der standardmäßige Skripthost ist jetzt "cscript.exe".

...einmalig vom CMD-Prompt eingeben.
Siehe Hilfe zu CScript /?

Grüße
Biber

P.S. @76109 Du machst jetzt bitte dein ungeliebtes Umzugsgeraffel.
Weitere Kommentare von dir an diesem Wochenende werde ich löschen face-wink
Member: bastla
bastla Apr 24, 2010 at 15:19:54 (UTC)
Goto Top
Hallo @all!

Da wart Ihr ja fleißig - Dieter jedenfalls hat meinen (für ungefähr jetzt geplanten) nächsten Versuch (erfolgreich) vorweg- und damit offensichtlich eine Doppelbelastung auf sich genommen. face-smile
LotPings "ForceCscript" tut auch bei mir (allerdings bisher nur unter XP SP3 getestet) was es soll (und wäre daher einfach in Dieters Script am Anfang und Ende hinzuzufügen) ...

Grüße
bastla

P.S.: @Biber
Weitere Kommentare von dir an diesem Wochenende werde ich löschen face-wink
Per "move"-Befehl? face-wink
Member: BuRnInGfIrE
BuRnInGfIrE Apr 24, 2010 at 15:38:11 (UTC)
Goto Top
Ach herje, was bin ich blind!

Du hast ja recht, basta.
Ich habe doch total übersehen dass Zeile 1 ja auch anders ist, lol.

Nun ist der skript perfekt.

Danke euch allen.

MfG BuRnInGfIrE
Member: bastla
bastla Apr 24, 2010 at 16:10:16 (UTC)
Goto Top
Hallo BuRnInGfIrE!
Ich habe doch total übersehen dass Zeile 1 ja auch anders ist, lol.
Kein Wunder - gibt's doch schon wieder keine Kommentare in den Scripts face-wink ...

... was aber zum Glück den erfolgreichen Abschluss dieses Threads nur ein wenig verzögert hat.

Grüße
bastla
Mitglied: 76109
76109 Apr 25, 2010 at 18:20:40 (UTC)
Goto Top
Hallooo erstmal!

@77559
Dann weiterhin erfolgreiche Umzugsvorereitungen.
Yep, danke. Das schlimmste habe ich geschafft (in alter Wohnung) und bin gut im Zeitplanface-smile

@Biber
P.S. @76109 Du machst jetzt bitte dein ungeliebtes Umzugsgeraffel.
Weitere Kommentare von dir an diesem Wochenende werde ich löschen
Habe schon die ganze Woche schwer geschuftet und habe mir am Samstag mal ne längere Kaffeepause gegönnt und bei dieser Gelegenheit das Skript gebastelt. War ne angenehme Abwechslung und hat meine Motivation wieder etwas gestärktface-wink

@bastla
Da wart Ihr ja fleißig - Dieter jedenfalls hat meinen (für ungefähr jetzt geplanten) nächsten Versuch (erfolgreich) vorweg- und
damit offensichtlich eine Doppelbelastung auf sich genommen.
Sorry, wenn ich Deine Pläne etwas durcheinander gebracht habeface-devilish

@ BuRnInGfIrE
WOW nun rennt das teil ja so richtig mit lichtgeschwindigkeit .
Super Arbeit - Lob.
Doch so schnellface-smile Die Geschwindigkeit hatte ich aus Zeitgründen nicht getestet und habe nur mal angenommen, dass es um einiges schneller laufen müsste.

Ansonsten, hat dieser Thread Spaß gemachtface-smile

Und nun, muss ich wieder weiter schuften:'(

Gruß Dieter