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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 141347
Url: https://administrator.de/forum/ersten-32-bytes-mehrerer-binaer-dateien-mit-batch-oder-vbs-loeschen-141347.html
Ausgedruckt am: 17.04.2025 um 07:04 Uhr
21 Kommentare
Neuester Kommentar
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:
Falls der Zielordner noch nicht existiert, wird dieser erstellt.
Im Zielordner ev bereits vorhandene gleichnamige Dateien werden ohne Rückfrage überschrieben.
Grüße
bastla
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."
Im Zielordner ev bereits vorhandene gleichnamige Dateien werden ohne Rückfrage überschrieben.
Grüße
bastla
Hallo BuRnInGfIrE!
Freut mich, wenn's passt.
Das Lob steht aber auf jeden Fall didi1954 zu ...
Grüße
bastla
Freut mich, wenn's passt.
Das Lob steht aber auf jeden Fall didi1954 zu ...
Grüße
bastla
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
) - 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
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
Grüße
bastla

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
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

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.Gibt es eine möglichkeit sowas wie ein fortschrittsbalken oder so änlich, was zeigt wie weit er ist, anzuzeigen?
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

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
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

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.
@bastla
Danke für Verwendung meines Codeschnipsels und die Lobesweiterreichung
Gruß Dieter
PS. Und eigentlich habe ich wegen Umzugsvorbereitungen überhaupt keine Zeit
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 Lobesweiterreichung
Gruß Dieter
PS. Und eigentlich habe ich wegen Umzugsvorbereitungen überhaupt keine Zeit

Hallo Dieter,
sieht gut aus, kann es leider nicht testen weil mein Avira da ein
"HTML/ADODB.Exploit.Gen"
fehlerkennt.
Gruß
LotPings
sieht gut aus, kann es leider nicht testen weil mein Avira da ein
"HTML/ADODB.Exploit.Gen"
fehlerkennt.
Gruß
LotPings

Hallo LotPings!
Ich nutze das Antivirus aus der gelben Schachtel und der gibt mir keine derartige Meldung?
Gruß Dieter
Ich nutze das Antivirus aus der gelben Schachtel und der gibt mir keine derartige Meldung?
Gruß Dieter

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.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
.
Super Arbeit - Lob.
Schließe mich da an, auf meinem XP-Rechner läufts (auch mit Avira aber ohne Fehlalarm)WOW nun rennt das teil ja so richtig mit lichtgeschwindigkeit
Super Arbeit - Lob.
Dann weiterhin erfolgreiche Umzugsvorereitungen.
Gruß
LotPings
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...
...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
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
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.
LotPings "
Grüße
bastla
P.S.: @Biber

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.
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 
Per "move
"-Befehl? 
Hallooo erstmal!



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ß gemacht
Und nun, muss ich wieder weiter schuften:'(
Gruß Dieter
@77559
Dann weiterhin erfolgreiche Umzugsvorereitungen.
Yep, danke. Das schlimmste habe ich geschafft (in alter Wohnung) und bin gut im ZeitplanDann weiterhin erfolgreiche Umzugsvorereitungen.
@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ärktP.S. @76109 Du machst jetzt bitte dein ungeliebtes Umzugsgeraffel.
Weitere Kommentare von dir an diesem Wochenende werde ich löschen
@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 habeDa 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.
@ BuRnInGfIrE
WOW nun rennt das teil ja so richtig mit lichtgeschwindigkeit .
Super Arbeit - Lob.
Doch so schnellWOW nun rennt das teil ja so richtig mit lichtgeschwindigkeit .
Super Arbeit - Lob.
Ansonsten, hat dieser Thread Spaß gemacht
Und nun, muss ich wieder weiter schuften:'(
Gruß Dieter