unregelmäßige zeichenlänge am anfang einer txt-datei auslesen und vergleichen lassen
erst mal zum terrain:
also
ich habe mir einen cryptomaten aus ncryptschnippseln zusammengebastelt, der beim verschlüsseln ein beliebiges format in eine txt umbenennt, deren inhalt verschlüsselt und an einen rechner sendet. an diesem rechner wird das passende decrypt-programm mit den passwortdateien gespeist und decodiert den zeichensalat ein wenig. nun soll diese decrypt.bat den anfang der klartextdatei lesen um daraus das ursprüngliche format zu erschließen und die datei wieder richtig umzubenennen.
dazu habe ich mir mal die arbeit gemacht und eindeutige identifikationsgesichtspunkte von in txt umbenannten dateiformaten analysiert:
if BM6 am anfang der datei, rename output.txt output.bmp
Rar! am anfang der datei, rename output.txt output.rar
ID3 am anfang der datei, rename output.txt output.mp3
ÿØÿà am anfang der datei, rename output.txt output.jpg
‰PNG am anfang der datei, rename output.txt output.png
MZ am anfang der datei, rename output.txt output.exe
<html <head <body <!DOCTYPE html am anfang der datei, rename output.txt output.html
%PDF am anfang der datei, rename output.txt output.pdf
PK am anfang der datei, rename output.txt output.zip
.RMF am anfang der datei, rename output.txt output.rmm
MZ am anfang der datei, rename output.txt output.dll
º! oder ³ am anfang der datei, rename output.txt output.mpg
{\rtf1 am anfang der datei, rename output.txt output.rtf
MSCF am anfang der datei, rename output.txt output.cab
FWS oder CWS am anfang der datei, rename output.txt output.swf
y—ÀX am anfang der datei, rename output.txt output.csa
GIF am anfang der datei, rename output.txt output.gif
II* am anfang der datei, rename output.txt output.tif
oggs am anfang der datei, rename output.txt output.ogg
RIFF?? WAVEfmt am anfang der datei, rename output.txt output.wav
RIFF??? AVI am anfang der datei, rename output.txt output.avi
bei sehr vielen anderen formaten wie doc, ppt, xls, msi, itw, wma und sehr sehr vielen anderen bin ich auf kein für dieses format typisches merkmal gestoßen was sich nur bei diesem dateityp wiederholt.
nun ist ein problem, dass ich nicht weiß wie ich den anfang einer txt auslese, ein anderes, dass die anzahl der zu lesenden buchstaben ungleich ist (mal sind 12 buchstaben mit platzhaltern notwendig, ein anderes mal nur 2 um eindeutig das format zu bestimmen) und ein weiteres, dass bei avi und wav die jokerzeichen jokerzeichen sind (anders als bei tif). hier steht nach dem riff bei wav 2 zeichen lang blumentopferde und bei riff von avi 3 mal irgendein zeichen das bei jeder weiteren umbenannten avi anders ist.
mit den bereits hier im forum genannten beispielen konnte ich mir irgendwie keinen brauchbaren näherungswert reimen.
ich denke mal, man wird die erste zeile lesen, deren anfang mit den bekannten zeichen vergleichen und daraufhin die dateinamen ändern.
ein fertiges programm dafür zu nehmen wäre langweilig. und gnupg zu modifizieren, dazu bin ich nicht in der lage^-^
falls jemand einen besseren weg kennt, bloß bescheid sagen. ich bin wie man sieht noch ziemlicher noob und freue mich über jedes hilfeangebot.
Gruß von dem bösen das jeder kennt, doch das niemand beim namen nennt.
also
ich habe mir einen cryptomaten aus ncryptschnippseln zusammengebastelt, der beim verschlüsseln ein beliebiges format in eine txt umbenennt, deren inhalt verschlüsselt und an einen rechner sendet. an diesem rechner wird das passende decrypt-programm mit den passwortdateien gespeist und decodiert den zeichensalat ein wenig. nun soll diese decrypt.bat den anfang der klartextdatei lesen um daraus das ursprüngliche format zu erschließen und die datei wieder richtig umzubenennen.
dazu habe ich mir mal die arbeit gemacht und eindeutige identifikationsgesichtspunkte von in txt umbenannten dateiformaten analysiert:
if BM6 am anfang der datei, rename output.txt output.bmp
Rar! am anfang der datei, rename output.txt output.rar
ID3 am anfang der datei, rename output.txt output.mp3
ÿØÿà am anfang der datei, rename output.txt output.jpg
‰PNG am anfang der datei, rename output.txt output.png
MZ am anfang der datei, rename output.txt output.exe
<html <head <body <!DOCTYPE html am anfang der datei, rename output.txt output.html
%PDF am anfang der datei, rename output.txt output.pdf
PK am anfang der datei, rename output.txt output.zip
.RMF am anfang der datei, rename output.txt output.rmm
MZ am anfang der datei, rename output.txt output.dll
º! oder ³ am anfang der datei, rename output.txt output.mpg
{\rtf1 am anfang der datei, rename output.txt output.rtf
MSCF am anfang der datei, rename output.txt output.cab
FWS oder CWS am anfang der datei, rename output.txt output.swf
y—ÀX am anfang der datei, rename output.txt output.csa
GIF am anfang der datei, rename output.txt output.gif
II* am anfang der datei, rename output.txt output.tif
oggs am anfang der datei, rename output.txt output.ogg
RIFF?? WAVEfmt am anfang der datei, rename output.txt output.wav
RIFF??? AVI am anfang der datei, rename output.txt output.avi
bei sehr vielen anderen formaten wie doc, ppt, xls, msi, itw, wma und sehr sehr vielen anderen bin ich auf kein für dieses format typisches merkmal gestoßen was sich nur bei diesem dateityp wiederholt.
nun ist ein problem, dass ich nicht weiß wie ich den anfang einer txt auslese, ein anderes, dass die anzahl der zu lesenden buchstaben ungleich ist (mal sind 12 buchstaben mit platzhaltern notwendig, ein anderes mal nur 2 um eindeutig das format zu bestimmen) und ein weiteres, dass bei avi und wav die jokerzeichen jokerzeichen sind (anders als bei tif). hier steht nach dem riff bei wav 2 zeichen lang blumentopferde und bei riff von avi 3 mal irgendein zeichen das bei jeder weiteren umbenannten avi anders ist.
mit den bereits hier im forum genannten beispielen konnte ich mir irgendwie keinen brauchbaren näherungswert reimen.
ich denke mal, man wird die erste zeile lesen, deren anfang mit den bekannten zeichen vergleichen und daraufhin die dateinamen ändern.
ein fertiges programm dafür zu nehmen wäre langweilig. und gnupg zu modifizieren, dazu bin ich nicht in der lage^-^
falls jemand einen besseren weg kennt, bloß bescheid sagen. ich bin wie man sieht noch ziemlicher noob und freue mich über jedes hilfeangebot.
Gruß von dem bösen das jeder kennt, doch das niemand beim namen nennt.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 44827
Url: https://administrator.de/contentid/44827
Ausgedruckt am: 13.11.2024 um 07:11 Uhr
16 Kommentare
Neuester Kommentar
Hallo rumpelstielzchen987!
Bevor Du Dir mit Batch ein Bein ausreisst, vielleicht ein VBScript ...
Gleich vorweg: VBScript ist für die Bearbeitung von Text-, nicht von Binärdateien vorgesehen - sei also nicht überrascht, wenn zB ein Null-Byte Probleme bereitet. Da Du aber ohnehin nur eine bestimmte Anzahl von Zeichen benötigst, könnte es wie folgt gehen:
Aus angeborener Faulheit habe ich nur 2 3 Beispiele eingegeben, daher also bitte Liste am Anfang ergänzen! Die Anzahl der zu lesenden Zeichen mit derzeit 15 kannst Du an den längsten vorkommenden String anpassen.
Bei Aufruf von der Commandline mit
erhältst Du in der Textdatei "%Temp%\Typ.txt" den festgestellten Dateityp (oder "NotFound") für "C:\Pfad mit Leerstellen\Test.txt" und kannst mit Batch weitermachen (vorausgesetzt wurde, dass die Scriptdatei im Ordner "C:\Scripts" liegt).
Wenn Du übrigens die zu testende Datei auf die Scriptdatei ziehst, wird das Ergebnis in einer MessageBox angezeigt.
HTH
bastla
[Edit] Weil die anderen gar so verunstaltet waren, habe ich (trotz Faulheit) noch "mp3" dazugenommen. [/Edit]
Bevor Du Dir mit Batch ein Bein ausreisst, vielleicht ein VBScript ...
Gleich vorweg: VBScript ist für die Bearbeitung von Text-, nicht von Binärdateien vorgesehen - sei also nicht überrascht, wenn zB ein Null-Byte Probleme bereitet. Da Du aber ohnehin nur eine bestimmte Anzahl von Zeichen benötigst, könnte es wie folgt gehen:
'CheckFileType.vbs
Dim sSignature(3), sTyp(3)
sSignature(1) = "y—ÀX " : sTyp(1) = "csa"
sSignature(2) = "ÿØÿá" : sTyp(2) = "jpg"
sSignature(3) = "ID3" : sTyp(3) = "mp3"
sTestFile = WScript.Arguments(0)
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set oFile = fso.OpenTextFile(sTestFile, 1)
sStart = oFile.Read(15)
oFile.Close
sTypGefunden = "NotFound"
For i = 1 To UBound(sSignature)
If Left(sStart, Len(sSignature(i))) = sSignature(i) Then
sTypGefunden = sTyp(i)
Exit For
End If
Next
WScript.Echo sTypGefunden
Bei Aufruf von der Commandline mit
cscript //nologo C:\Scripts\CheckFileType.vbs "C:\Pfad mit Leerstellen\Test.txt" > %Temp%\Typ.txt
Wenn Du übrigens die zu testende Datei auf die Scriptdatei ziehst, wird das Ergebnis in einer MessageBox angezeigt.
HTH
bastla
[Edit] Weil die anderen gar so verunstaltet waren, habe ich (trotz Faulheit) noch "mp3" dazugenommen. [/Edit]
Hallo rumpelstielzchen987!
Bevor Du Dir mit VBscript ein Bein ausreisst, vielleicht ein simpler Batch... **gg
Leg Dir für Deine HeaderInformationen eine einfache 2-spaltige Textdatei an (mit einem Leerzeichen zwischen Signatur und Extension):
Die Batchdatei sähe etwas kürzer aus als bastla's Schnipsel:
Ich hab sie mir zum Testen etwas umgeschrieben:
...damit ich eine beliebige Datei testen kann (die ich Parameter übergebe). Bei Dir heißt die ja immer output.txt
Ergebnis:
Grüße
Biber
Bevor Du Dir mit VBscript ein Bein ausreisst, vielleicht ein simpler Batch... **gg
Leg Dir für Deine HeaderInformationen eine einfache 2-spaltige Textdatei an (mit einem Leerzeichen zwischen Signatur und Extension):
-------snipp Headerinfo.txt ---------------> mit deinem Editor im DOS-Zeichensatz speichern; nicht im ANSI-Zeichensatz.
HeaderTag FileExtension
BM6 .bmp
Rar! .rar
ID3 .mp3
ÿØÿà .jpg
ëPNG .png
....
MSCF .cab
....
Die Batchdatei sähe etwas kürzer aus als bastla's Schnipsel:
::-----GetExtensionBySignature.bat
@echo off & setlocal
Set /p Signature=<output.txt
For /f "skip=2 tokens=2" %%i in ('Find "%signature%" Headerinfo.txt ^2^>nul') do Set "Extension=%%i"
@echo Signatur: [%signatur%] ...... Extension: [%Extension%]
if defined extension rename output.txt output%extension%
Ich hab sie mir zum Testen etwas umgeschrieben:
::-----snipp GetExtBySigTest.bat
@echo off & setlocal
Set /p Signature=<%1
For /f "skip=2 tokens=2" %%i in ('Find "%signature%" Headerinfo.txt ^2^>nul') do Set "Extension=%%i"
@echo Signatur: [%signature%] ...... Extension: [%Extension%]
Ergebnis:
>
>getExtBySigTest.bat iuident.cab
Signatur: [MSCF] ...... Extension: [.cab]
>getExtBySigTest.bat xsetlogo.png
Signatur: [‰PNG] ...... Extension: [.png]
Grüße
Biber
@Rumpel
bastla's Tipps funktionieren immer...
Ich würde mich freuen, wenn Du auch eine Rückmeldung gibst, wenn es einfach works as designed.
Thx
Biber
wenn eure tipps nicht funktionieren, melde ich mich wieder
bastla's Tipps funktionieren immer...
Ich würde mich freuen, wenn Du auch eine Rückmeldung gibst, wenn es einfach works as designed.
Thx
Biber
@stielz
Glaub ihm kein Wort
@Biber
In Zukunft fabriziere ich auch nur mehr few-liner (etwa so, wobei ich noch mindestens eine Zeile verschenkt habe):
Grüße
bastla
Glaub ihm kein Wort
@Biber
In Zukunft fabriziere ich auch nur mehr few-liner (etwa so, wobei ich noch mindestens eine Zeile verschenkt habe):
Dim Sig(3),Typ(3):Sig(1)="y—ÀX":Typ(1)="csa":Sig(2)="ÿØÿá":Typ(2)="jpg":Sig(3)="ID3":Typ(3)="mp3"
s=WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0),1).Read(15)
t="NotFound":For i=1 To UBound(Sig):If Left(s,Len(Sig(i)))=Sig(i) Then t=Typ(i):Exit For
Next:WScript.Echo t:If t="NotFound" Then WScript.Quit(1)
Grüße
bastla
@bastla
Das wäre aber kryptisch... *gg
Ich würde zwar auch ohne Hilfsdatei auskommen, aber das verkneif ich mir...
Demo:
Grüße
Biber
Das wäre aber kryptisch... *gg
Ich würde zwar auch ohne Hilfsdatei auskommen, aber das verkneif ich mir...
@echo off & setlocal & Set /p Signature=<%1
For %%s in (BM6.bmp Rar!.rar ID3.mp3 ÿØÿà.jpg ëPNG.png MSCF.cab) Do (
For /f "tokens=1-2 delims=." %%a in ("%%s") do If /i [%signature%]==[%%a] Echo Extension=.%%b
)
Demo:
>getExtBySignature.bat iuident.cab
Extension=cab
>getExtBySignature.bat xsetlogo.png
Extension=png
Grüße
Biber
@Biber
Ich trag's mit Fassung ...
À propos "kryptisch": Magst Du mir erklären, warum bei Deinem Schnipsel oben das "Find" überhaupt funktioniert? Syntaktisch schaut das für mich etwas sehr ungewöhnlich aus (wobei ich grundsätzlich schon die Verwendung von "Find" mit Pipe als Filter bzw mit Umleitung der Eingabe kenne).
Wieso das Escape für die Umleitung der Fehlermeldungen (^2^>nul)?
Und übrigens ...
<nitpick>
Mit "Find" kannst Du aber eigentlich nicht sicher sein, dass der Suchstring am Anfang der Datei steht, und durch die Schleife kommt die letzte Übereinstimmung zum Zug (wobei es natürlich ziemlicher Zufall sein müsste, dass etwa ein mp3-File die dem String "{\rtf1" entsprechenden Bytes enthielte)?
</nitpick>
Grüße
bastla
Ich trag's mit Fassung ...
À propos "kryptisch": Magst Du mir erklären, warum bei Deinem Schnipsel oben das "Find" überhaupt funktioniert? Syntaktisch schaut das für mich etwas sehr ungewöhnlich aus (wobei ich grundsätzlich schon die Verwendung von "Find" mit Pipe als Filter bzw mit Umleitung der Eingabe kenne).
Wieso das Escape für die Umleitung der Fehlermeldungen (^2^>nul)?
Und übrigens ...
<nitpick>
Mit "Find" kannst Du aber eigentlich nicht sicher sein, dass der Suchstring am Anfang der Datei steht, und durch die Schleife kommt die letzte Übereinstimmung zum Zug (wobei es natürlich ziemlicher Zufall sein müsste, dass etwa ein mp3-File die dem String "{\rtf1" entsprechenden Bytes enthielte)?
</nitpick>
Grüße
bastla
@bastla
... aber da Find/Findstr ja nur Fehlermeldungen bringen bei Syntaxfehlern oder wenn die zu durchsuchende Datei fehlt, ist es eigentlich überflüssig.
Maskieren muss ich mit dem Caret "^" innerhalb der FOR-Anweisungsklammer alles, was für die CMD.exe ein Steuerzeichen ist.
Und "2" und ">" gehören dazu.
Und sonst könnte ich natürlich auf "Find.exe" verzichten und es wie in der zweiten Skizze machen mit direktem Vergleich "..
Siehe das... "....If /i [%signature%]==[%%a]..."
@Rumpel
Jau. sowohl bastla wie ich wären so vorgegangen, jeweils die "Signatur" bzw die ersten Bytes der output.txt mit einem ebenfalls als "Text" vorliegenden Matchstring zu vergleichen.
Exakt. Ohne Berücksichtigung der "Wildcard-Varianten", die Du genannt hast. Da fassen wir beide ins Leere.
Werde ich auch nicht mit Batch-Mitteln gebacken bekommen, weil ich dann auch mit Wildcards vergleichen - also letzten Endes mit Regular Expressions arbeiten müsste.
Das kann von den Konsolen-Utilities aber nur FindStr.exe, nicht aber Find.exe.
Aber: FindStr.exe ist leider schnell und lieblos zusammengeschustert worden von Microsoft...
...da kann ich GAR NICHT mit Zeichen der erweiterten Zeichensätze suchen (nicht mal nach Umlauten).
Auch bastla bzw. VBScript ist mit Regular Expressions ein bisschen überfordert, denke ich.
Wir sollten also alle auf jemand warten, der entweder mit PERL das Kram abfackelt ODER auf jemand, der Lust hat,
diese Signaturen Byte für Byte als HexCode zu vergleichen.
Andererseits wird dann früher oder später die Frage kommen, wieso das überhaupt sein muss...
Du musst die Informationen, welche Dateiendungen sich hinter/unter dem namen der output.txt verbergen, doch gehabt haben VOR dem Verschlüsseln??
Wieso hast Du nicht aufbewahrt?? Schlechte Planung? *gg
Ich habe vorhin geantwortet, weil es natürlich mit einfachen Mitteln möglich ist,
die ersten paar Bytes eines unbekannten Files als Dateityp zu interpretieren, aber zuverlässig ist es nicht.
Siehe Deine "MZ"-Interpretation als "*.exe" und als "*.dll".
Und als weiteres Indiz, dass es keine funktionierenden Windows-Utilities gibt, die GetFileType.exe heißen.
Unter *nix-Systemen ist das kein Thema.
Gruß
Biber
Wieso das Escape für die Umleitung der Fehlermeldungen (^2^>nul)?
Das ist nur für den Fall, dass die Extension nicht gefunden wäre....... aber da Find/Findstr ja nur Fehlermeldungen bringen bei Syntaxfehlern oder wenn die zu durchsuchende Datei fehlt, ist es eigentlich überflüssig.
Maskieren muss ich mit dem Caret "^" innerhalb der FOR-Anweisungsklammer alles, was für die CMD.exe ein Steuerzeichen ist.
Und "2" und ">" gehören dazu.
Mit "Find" kannst Du aber eigentlich nicht sicher sein, dass der Suchstring am Anfang der Datei steht,
Ja mei.... da in der Textdatei nur knapp 10 Zeichen in einer Zeile stehen, z.B. "ëPNG .png" oder "MSCF .cab" , kann ich damit leben.Und sonst könnte ich natürlich auf "Find.exe" verzichten und es wie in der zweiten Skizze machen mit direktem Vergleich "..
Siehe das... "....If /i [%signature%]==[%%a]..."
@Rumpel
wäre jemand so freundlich mal zusammenzufassen
Jau. sowohl bastla wie ich wären so vorgegangen, jeweils die "Signatur" bzw die ersten Bytes der output.txt mit einem ebenfalls als "Text" vorliegenden Matchstring zu vergleichen.
Exakt. Ohne Berücksichtigung der "Wildcard-Varianten", die Du genannt hast. Da fassen wir beide ins Leere.
Werde ich auch nicht mit Batch-Mitteln gebacken bekommen, weil ich dann auch mit Wildcards vergleichen - also letzten Endes mit Regular Expressions arbeiten müsste.
Das kann von den Konsolen-Utilities aber nur FindStr.exe, nicht aber Find.exe.
Aber: FindStr.exe ist leider schnell und lieblos zusammengeschustert worden von Microsoft...
...da kann ich GAR NICHT mit Zeichen der erweiterten Zeichensätze suchen (nicht mal nach Umlauten).
Auch bastla bzw. VBScript ist mit Regular Expressions ein bisschen überfordert, denke ich.
Wir sollten also alle auf jemand warten, der entweder mit PERL das Kram abfackelt ODER auf jemand, der Lust hat,
diese Signaturen Byte für Byte als HexCode zu vergleichen.
Andererseits wird dann früher oder später die Frage kommen, wieso das überhaupt sein muss...
Du musst die Informationen, welche Dateiendungen sich hinter/unter dem namen der output.txt verbergen, doch gehabt haben VOR dem Verschlüsseln??
Wieso hast Du nicht aufbewahrt?? Schlechte Planung? *gg
Ich habe vorhin geantwortet, weil es natürlich mit einfachen Mitteln möglich ist,
die ersten paar Bytes eines unbekannten Files als Dateityp zu interpretieren, aber zuverlässig ist es nicht.
Siehe Deine "MZ"-Interpretation als "*.exe" und als "*.dll".
Und als weiteres Indiz, dass es keine funktionierenden Windows-Utilities gibt, die GetFileType.exe heißen.
Unter *nix-Systemen ist das kein Thema.
Gruß
Biber
Hallo rumpelstielzchen987!
Im übrigen lässt sich natürlich das Umbenennen der übergebenen Datei (zB "output.txt") auch innerhalb des Scripts erledigen; verbesserte/ergänzte Version daher:
Verwendung des Scripts: Am einfachsten per Drag and Drop ("output.txt" auf das Script ziehen)
Anmerkung zu Sigs 2 und 3: Ich habe ".jpg"-Dateien mit den Varianten E0 oder E1 für Byte 3 gefunden ...
Grüße
bastla
bei .html kann es sein dass die html-datei mit <doctype! html beginnt. ein leerzeichen in der signatur. bei mpg ist eigentlich auch eins davor, das durch das forum autokorrigiert wurde. stören die, oder wird %Extension% durch den punkt erkannt? wohl nicht... fällt da jemandem eine lösung ein?
Wenn die Signaturen richtig eingelesen werden (was zu testen wäre, aber bei "<doctype! html" klappen müsste), stören Blanks sicherlich nicht.das zweite problem sind die jokerzeichen bei wav und avi die als jokerzeichen dienen. hier unterscheiden sich auch avis untereinander. wie kann ich dem script sagen, dass bei avi und bei wav wirkliche platzhalter im spiel sind? wenn ich das pauschalisiere und alle joker als joker nehmen lasse klappt es ja auch...
Dafür hatte ich bisher keine Vorsorge getroffen. Für die Spezialfälle "wav" und "avi" ließen sich aber zusätzliche Tests einbauen, etwaIf Left(sStart, 4) = "RIFF" Then If Mid(sStart, 9, 7) = "WAVEfmt" Then sTypGefunden = "wav"
Im übrigen lässt sich natürlich das Umbenennen der übergebenen Datei (zB "output.txt") auch innerhalb des Scripts erledigen; verbesserte/ergänzte Version daher:
'SetFileType.vbs
Dim sSignature(3), sTyp(3)
sSignature(1) = "y—ÀX " : sTyp(1) = "csa"
sSignature(2) = "ÿØÿà" : sTyp(2) = "jpg"
sSignature(3) = "ÿØÿá" : sTyp(3) = "jpg"
sTestFile = WScript.Arguments(0)
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set oFile = fso.OpenTextFile(sTestFile, 1)
sStart = oFile.Read(15)
oFile.Close
sTypGefunden = "NotFound"
For i = 1 To UBound(sSignature)
If Left(sStart, Len(sSignature(i))) = sSignature(i) Then
sTypGefunden = sTyp(i)
Exit For
End If
Next
If Left(sStart, 4) = "RIFF" Then If Mid(sStart, 9, 7) = "WAVEfmt" Then sTypGefunden = "wav"
If sTypGefunden <> "NotFound" Then
Set oFile = fso.GetFile(sTestFile)
sNewName = Left(oFile.Name, InStrRev(oFile.Name, ".") - 1) & "." & sTypGefunden
oFile.Name = sNewName
End If
Verwendung des Scripts: Am einfachsten per Drag and Drop ("output.txt" auf das Script ziehen)
Anmerkung zu Sigs 2 und 3: Ich habe ".jpg"-Dateien mit den Varianten E0 oder E1 für Byte 3 gefunden ...
Grüße
bastla
@Biber
Darf ich Dich nochmals auf die "Find"-Syntax ansprechen? Ich hätte vermutlich etwas in der Art versucht:
Bedeutet das "<%1" in Deiner Version, dass Du den gesamten Inhalt (zumindest soviel davon als Text verstanden wird) der "output.txt" als Suchbegriff verwendest und daher nach einem längeren String in einem kürzeren suchst?
Verwirrte Grüße
bastla
Darf ich Dich nochmals auf die "Find"-Syntax ansprechen? Ich hätte vermutlich etwas in der Art versucht:
For /f "tokens=1-2" %%a in (Headerinfo.txt) do Find "%%a" output.txt && Set "Extension=%%b"
Bedeutet das "<%1" in Deiner Version, dass Du den gesamten Inhalt (zumindest soviel davon als Text verstanden wird) der "output.txt" als Suchbegriff verwendest und daher nach einem längeren String in einem kürzeren suchst?
Verwirrte Grüße
bastla
@bastla
Auch wenn ich wenig Vertrauen in diese Ersten-paar-Bytes-Interpretationen habe:
wenn dort überhaupt etwas zum Wiederfinden hinterlegt ist, dann ist es mit Hex(0) abgeschlossen.
Und bis dahin lese ich.. *gg
Aber bei Binär-Dateien ist es dann nicht: "daher nach einem längeren String in einem kürzeren"...
Sonst würde meine Strategie so nicht funktionieren, da geb ich Dir Recht. *g
Und auch nicht, wenn rumpelchen sich für andere Matchstrings entschieden hat als die Zeichen, die vor einem 0x0 stehen...
[ Beispiel *.bmp-Dateien:
set /p head=<setup.bmp
set head
head=BM6ö
]
Also: meine Methode funktioniert bei Binärdateien ganz gut, aber...
Selbst eine normale Html-Datei erwisch ich nicht, fällt mir grad auf....
Textformate müsste ich separat abfackeln.... also .html, .txt, .xml,...und Hundert andere.... ich komme also auch nicht richtig weit.
Grüße
Biber
Bedeutet das "<%1" in Deiner Version, dass Du den gesamten Inhalt (zumindest soviel davon als Text verstanden wird)
der "output.txt" als Suchbegriff verwendest
und daher nach einem längeren String in einem kürzeren suchst?
Jepp, exakt. Der erste Teil zumindest..."den gesamten Inhalt (zumindest soviel davon als Text verstanden wird) "der "output.txt" als Suchbegriff verwendest
und daher nach einem längeren String in einem kürzeren suchst?
Auch wenn ich wenig Vertrauen in diese Ersten-paar-Bytes-Interpretationen habe:
wenn dort überhaupt etwas zum Wiederfinden hinterlegt ist, dann ist es mit Hex(0) abgeschlossen.
Und bis dahin lese ich.. *gg
Aber bei Binär-Dateien ist es dann nicht: "daher nach einem längeren String in einem kürzeren"...
Sonst würde meine Strategie so nicht funktionieren, da geb ich Dir Recht. *g
Und auch nicht, wenn rumpelchen sich für andere Matchstrings entschieden hat als die Zeichen, die vor einem 0x0 stehen...
[ Beispiel *.bmp-Dateien:
set /p head=<setup.bmp
set head
head=BM6ö
]
Also: meine Methode funktioniert bei Binärdateien ganz gut, aber...
Selbst eine normale Html-Datei erwisch ich nicht, fällt mir grad auf....
Textformate müsste ich separat abfackeln.... also .html, .txt, .xml,...und Hundert andere.... ich komme also auch nicht richtig weit.
Grüße
Biber
Sorry, rumpie,
Deine erwähnten <edit>s habe ich vorhin tatsächlich überlesen.
Aber jetzt möchte ich auf ein größeres Problem eingehen.
Ein Problem bei der angestrebten Strategie ist, dass sie eigentlich nicht funktionieren kann (um gleich mit der Tür ins Haus zu fallen).
Wir reden hier von Äpfeln und Birnen.
a) Äpfel oder Bnärdateien haben in den ersten Bytes eine Signatur... siehe bei .exe, .jpg, .mp3, .pdf, ...
Da passt meine Batch-Hauruck-Mimik.
b) Birnen oder Textfiles wie *.txt, *,vbs, *.cmd, *.xml, *.css, *.htm(l)
DIE HABEN KEINEN HEADER.
Sicherlich ganz deutlich bei *.txt-Dateien ...wie wolltest Du meine "Extension.txt" als Textdatei erkennen?
Bei XML oder HTM(L)-Dateien könnte man/frau die ersten 4 ("XML") oder 5 ("<HTML") Zeichen prüfen... aber auch das ist schon windig.
Eine .vbs oder .cvs oder .bat-Datei ist gar nicht an der ersten Zeile erkennbar. Es gibt auch keine bestimmte Zeile, die so eine Datei enthalten muss.
Führ ich jetzt nicht weiter aus... für mich erkennbar ist: Dateierkennung aufgrund Headerinfos geht nicht bei Nicht-Binärdateien. Ende,
Alternativstrategien:
1) Du lieferst die Original-Namen irgendwie mit. Für jede gesendete/bereitgestellte "Output.txt".
Die Mimik hab ich ohnehin nicht verstanden...
-was macht den der Empfänger mit einer Datei output.exe, die bei ihm ankommt? Erstmal anstarten?
- und wenn drei *.exe und vier *dll-Dateien gesendet werden oder 3000 *.jpg-Urlaubsfotos, kommt dann je eine output.exe und ein output.jpg an?
2) Oder - du sendest alle Dateien gleich immer im Zip-Format...also eine verschlüsslte output.txt, die eine entschlüsselte output.txt ergibt, die in Wirklichkeit eine output.zip ist...und in der natürlich alle Namen erhalten bleiben.
Das kannst Du dann aber lesbarer machen...sende eine inputcrypted.xyz, entschlüssele in eine Output.zip.
Was spräche dagegen?
Gruß
Biber
Deine erwähnten <edit>s habe ich vorhin tatsächlich überlesen.
lässt sich die Headerinfo.txt nicht auch in die bat einbinden?
Ja, siehe meine zweite Variante mit den beiden FOR-Anweisungen.das müsste ja dann für den "stapelverarbeiter" als "nichtbefehl", für das script aber als signatur gelten...
wenn es nicht geht pack ich es in einen beiliegenden "sources"-ordner... auch kein problem. Danke aber schon im vorraus
wenn es nicht geht pack ich es in einen beiliegenden "sources"-ordner... auch kein problem. Danke aber schon im vorraus
Aber jetzt möchte ich auf ein größeres Problem eingehen.
Ein Problem bei der angestrebten Strategie ist, dass sie eigentlich nicht funktionieren kann (um gleich mit der Tür ins Haus zu fallen).
Wir reden hier von Äpfeln und Birnen.
a) Äpfel oder Bnärdateien haben in den ersten Bytes eine Signatur... siehe bei .exe, .jpg, .mp3, .pdf, ...
Da passt meine Batch-Hauruck-Mimik.
b) Birnen oder Textfiles wie *.txt, *,vbs, *.cmd, *.xml, *.css, *.htm(l)
DIE HABEN KEINEN HEADER.
Sicherlich ganz deutlich bei *.txt-Dateien ...wie wolltest Du meine "Extension.txt" als Textdatei erkennen?
Bei XML oder HTM(L)-Dateien könnte man/frau die ersten 4 ("XML") oder 5 ("<HTML") Zeichen prüfen... aber auch das ist schon windig.
Eine .vbs oder .cvs oder .bat-Datei ist gar nicht an der ersten Zeile erkennbar. Es gibt auch keine bestimmte Zeile, die so eine Datei enthalten muss.
Führ ich jetzt nicht weiter aus... für mich erkennbar ist: Dateierkennung aufgrund Headerinfos geht nicht bei Nicht-Binärdateien. Ende,
Alternativstrategien:
1) Du lieferst die Original-Namen irgendwie mit. Für jede gesendete/bereitgestellte "Output.txt".
Die Mimik hab ich ohnehin nicht verstanden...
-was macht den der Empfänger mit einer Datei output.exe, die bei ihm ankommt? Erstmal anstarten?
- und wenn drei *.exe und vier *dll-Dateien gesendet werden oder 3000 *.jpg-Urlaubsfotos, kommt dann je eine output.exe und ein output.jpg an?
2) Oder - du sendest alle Dateien gleich immer im Zip-Format...also eine verschlüsslte output.txt, die eine entschlüsselte output.txt ergibt, die in Wirklichkeit eine output.zip ist...und in der natürlich alle Namen erhalten bleiben.
Das kannst Du dann aber lesbarer machen...sende eine inputcrypted.xyz, entschlüssele in eine Output.zip.
Was spräche dagegen?
Gruß
Biber
Moin rumpie,
nach einem oberflächlichen Test am CMD-Prompt sieht es so aus:
> auf diesem Weg kannst Du die Pseudosignaturen ermitteln, die das "set /p =<"-Kommando bei *.zip bzw. *.rar-Dateien reproduzierbar ausliest.
ACHTUNG: Die Anzeige des Ergebnisses stimmt naturlich nicht hier im HTML-Code, also selber am CMD-Prompt nachturnen. Kein Copy und Paste des Ergebnisses aus diesem Kommentar verwenden.
Diese beiden Matchstrings kannst Du dann in den oben geposteten Schnipsel einbauen.
[ungetestete Skizze .... würde toi toi toi *.zip und *.rar-Dateien erkennen.]
Gruß
Biber
nach einem oberflächlichen Test am CMD-Prompt sieht es so aus:
>set /p rarhead=<D:\temp\Irgendeine.rar
(=10:22:59 D:\temp=)
>set /p ziphead=<D:\temp\irgendein.zip
(=10:23:49 D:\temp=)
>echo Rarhead:[%rarhead%] ZipHead:[%ziphead%]
Rarhead:[Rar!→] ZipHead:[PK♥♦¶]
> auf diesem Weg kannst Du die Pseudosignaturen ermitteln, die das "set /p =<"-Kommando bei *.zip bzw. *.rar-Dateien reproduzierbar ausliest.
ACHTUNG: Die Anzeige des Ergebnisses stimmt naturlich nicht hier im HTML-Code, also selber am CMD-Prompt nachturnen. Kein Copy und Paste des Ergebnisses aus diesem Kommentar verwenden.
Diese beiden Matchstrings kannst Du dann in den oben geposteten Schnipsel einbauen.
:: ----snipp RarZipErkennung.bat [Parameter RarOderZipDateiname.mitbeliebigerExtension]
@echo off & setlocal & Set /p Signature=<%1
Set "rarSig=Rar!→"
set "ZipSig=PK♥♦¶"
For %%s in (%rarSig%.rar %zipSig%.zip) Do (
For /f "tokens=1-2 delims=." %%a in ("%%s") do If /i [%signature%]==[%%a] Echo Extension=.%%b
)
[ungetestete Skizze .... würde toi toi toi *.zip und *.rar-Dateien erkennen.]
Gruß
Biber