Batch Textersetzen mit Dateiname
Hallo,
bisher konnte ich hier (fast) immer eine Lösung für meine Probleme finden, aber heute war es dann soweit, dass ich ein Problem habe, dass hier anscheinend noch keine Lösung an sich parat hat.
Es geht um folgendes:
Ich habe ca. 10000 Dateien im .fmt Format. Diese kann ich öffnen mit einem Editor. Es ist zwar nur eine Zeile davon normal lesbar, aber die reicht mir.
Beispiel: Dateiname - 71822.fmt
In der Datei ist ein Verzeichnis für ein Bild angegeben. CryptischezeichenD:/BilderBilder/ET-no44592.bmpCryptischezeichen
Dieser Pfad soll jetzt geändert werden auf CryptischezeichenD:/Bilder/Bilderneu/00071822.bmpCryptischezeichen
D.h. der neue Pfad soll immer einfach der Dateiname sein mit .bmp
Leider hat sich herausgestellt, dass ich die Dateien nur mit einem Hexeditor ändern kann ohne dass sie danach unbrauchbar sind. D.h. mit Notepad geht es nicht, mit z.B. HxD geht es.
Das ganze dann mit allen 10000 Dateien, am besten automatisch
Ich hab bereits diverse Programme versucht. Beispielsweise: Advanced Find and Replace, ALIAS Find and Replace etc.
Leider scheitern diese Tools am Dateiname, da sie dafür keine Variable haben.
Habe auch schon versucht eine Batchfile zu erstellen, allerdings wurde hier ja mehrfach davon abgeraten sowas per Batch zu machen. Und erlichgesagt fehlt mir dazu noch die Erfahrung.
Vielleicht hat da jemand eine Idee wie ich soetwas bewerkstelligen könnte. Auskennen tu ich mich sonst noch einigermaßen in C.
Oder vielleicht gibts ja doch ein Tool das das kann?
Bin über jede Hilfe dankbar, sonst weiss ich schon was ich die nächsten 2 Wochen machen darf...
DANKE!
bisher konnte ich hier (fast) immer eine Lösung für meine Probleme finden, aber heute war es dann soweit, dass ich ein Problem habe, dass hier anscheinend noch keine Lösung an sich parat hat.
Es geht um folgendes:
Ich habe ca. 10000 Dateien im .fmt Format. Diese kann ich öffnen mit einem Editor. Es ist zwar nur eine Zeile davon normal lesbar, aber die reicht mir.
Beispiel: Dateiname - 71822.fmt
In der Datei ist ein Verzeichnis für ein Bild angegeben. CryptischezeichenD:/BilderBilder/ET-no44592.bmpCryptischezeichen
Dieser Pfad soll jetzt geändert werden auf CryptischezeichenD:/Bilder/Bilderneu/00071822.bmpCryptischezeichen
D.h. der neue Pfad soll immer einfach der Dateiname sein mit .bmp
Leider hat sich herausgestellt, dass ich die Dateien nur mit einem Hexeditor ändern kann ohne dass sie danach unbrauchbar sind. D.h. mit Notepad geht es nicht, mit z.B. HxD geht es.
Das ganze dann mit allen 10000 Dateien, am besten automatisch
Ich hab bereits diverse Programme versucht. Beispielsweise: Advanced Find and Replace, ALIAS Find and Replace etc.
Leider scheitern diese Tools am Dateiname, da sie dafür keine Variable haben.
Habe auch schon versucht eine Batchfile zu erstellen, allerdings wurde hier ja mehrfach davon abgeraten sowas per Batch zu machen. Und erlichgesagt fehlt mir dazu noch die Erfahrung.
Vielleicht hat da jemand eine Idee wie ich soetwas bewerkstelligen könnte. Auskennen tu ich mich sonst noch einigermaßen in C.
Oder vielleicht gibts ja doch ein Tool das das kann?
Bin über jede Hilfe dankbar, sonst weiss ich schon was ich die nächsten 2 Wochen machen darf...
DANKE!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 58272
Url: https://administrator.de/contentid/58272
Ausgedruckt am: 05.11.2024 um 11:11 Uhr
15 Kommentare
Neuester Kommentar
Dann starte ich mal einen ungetesteten Versuch.
miniversum
@echo off & setlocal enabledelayedexpansion
set "suchstring=D:/Bilder/Bilderneu/"
set "Cryptischezeichen=?????" & REM <-----------Hier anpassen
REM verarbeite alle Dateien nacheinander
FOR /F "delims=" %%d in ('dir /b *.fmt') do (
REM Suche Zeile inder %suchstring% steht
FOR /F "skip=1 delims=][" %%z in ('find /n "%suchstring%" "%%d"') do (
REM Schreibe alle Zeilen bis zur Zeile an inder der Suchstring steht in eine neue Datei
set /a zeile=1
FOR /F "delims=" %%l in ('type "%%d"') do (
if !zeile! lss %%z echo %%d>>"%%d_new.fmt"
set /a zeile=!zeile!+1
)
REM schreibe die ersetzte Zeile in die Neue Datei
%Cryptischezeichen%%suchstring%%%d.bmp%Cryptischezeichen%>>"%%d_new.fmt"
REM Schreibe alle Zeilen ab der Zeile an inder der Suchstring steht in eine neue Datei
set /a zeile=%%z+1
more +!zeile! "%%d">>"%%d_new.fmt"
)
)
Ok ich dachte diese Cryptischen Zeichen sind immer gleich.
Unter der Voraussetzung das in diesen Clyptischen Zeichen keine : und keine . vorkommen sollte es so gehen:
miniversum
Unter der Voraussetzung das in diesen Clyptischen Zeichen keine : und keine . vorkommen sollte es so gehen:
@echo off & setlocal enabledelayedexpansion
set "suchstring=D:/Bilder/Bilder/"
set "findenstring=D:/Bilder/Bilderneu/"
REM verarbeite alle Dateien nacheinander
FOR /F "delims=" %%d in ('dir /b *.fmt') do (
set "Datei=%%d"
REM Suche Zeile inder %suchstring% steht
FOR /F "skip=1 tokens=1,2 delims=][" %%y in ('find /n "%suchstring%" "!Datei!"') do (
set aenderzeile=%%y
set aendertext=%%z
REM Schreibe alle Zeilen bis zur Zeile an inder der Suchstring steht in eine neue Datei
set /a zeile=1
FOR /F "delims=" %%l in ('type "!Datei!"') do (
if !zeile! lss !aenderzeile! echo !Datei!>>"!Datei!_new.fmt"
set /a zeile=!zeile!+1
)
REM schreibe die ersetzte Zeile in die Neue Datei
FOR /F "tokens=1,2 delims=:" %%V in ('echo !aendertext!') do (
set vorderteil=%%V
set resttext=%%W
FOR /F "tokens=2 delims=:" %%e in ('echo %suchstring%') do set resttext=!resttext:%%e=!
)
FOR /F "tokens=2 delims=." %%H in ('echo !resttext!') do (
set hinterteil=%%H
)
echo !vorderteil:~0,-1!%findenstring%!Datei!.!hinterteil!>>"!Datei!_new.fmt"
REM Schreibe alle Zeilen ab der Zeile an inder der Suchstring steht in eine neue Datei
set /a zeile=!aenderzeile!+1
more +!zeile! "!Datei!">>"!Datei!_new.fmt"
)
)
miniversum
So jetzt hab ich mir ein bischen zeit genommen und nochmal alles einzeln durchgeschaut und getestet.
Hab ein paar kleinere Fehler gefunden und das ganze etwas eingeschrumpft.
Das Ergebnis sit das hier:
Voraussetzung ist immernoch das diese kryptischen Zeichen VOR und NACH dem zu ersetzenden String keinen : oder . enthalten.
miniversum
Hab ein paar kleinere Fehler gefunden und das ganze etwas eingeschrumpft.
Das Ergebnis sit das hier:
@echo off & setlocal enabledelayedexpansion
set "suchstring=D:/Bilder/Bilder/"
set "findenstring=D:/Bilder/Bilderneu/"
REM verarbeite alle Dateien nacheinander
FOR /F "delims=" %%d in ('dir /b *.fmt') do (
set "Datei=%%d"
set "Dateiname=%%~nd"
set "outfile=%%~nd_new.%%~xd"
if exist "!outfile!" del "!outfile!"
REM Suche Zeile inder %suchstring% steht
FOR /F "skip=2 tokens=1,2 delims=][" %%z in ('find /n "%suchstring%" "!Datei!"') do (
REM Schreibe alle Zeilen bis zur Zeile an inder der Suchstring steht in eine neue Datei
set /a zeile=1
FOR /F "delims=" %%t in ('type "!Datei!"') do (
if not !zeile! equ %%z (
echo %%t>>"!outfile!"
) else (
REM schreibe die ersetzte Zeile in die Neue Datei
FOR /F "tokens=1,2 delims=:" %%V in ('echo %%t') do (
set vorderteil=%%V
set vorderteil=!vorderteil:~0,-1!
set resttext=%%W
FOR /F "tokens=2 delims=:" %%e in ('echo %suchstring%') do set resttext=!resttext:%%e=!
)
FOR /F "tokens=2 delims=." %%H in ('echo !resttext!') do set hinterteil=%%H
echo !vorderteil!%findenstring%!Dateiname!.!hinterteil!>>"!outfile!"
)
set /a zeile=!zeile!+1
)
)
)
miniversum
Hallo Jonnyblue und miniversum!
Ich hatte schon befürchtet, dass es mit Batch schwierig werden könnte ...
Die genannte Alternative VBScript ist zwar auch nicht wirklich auf das Handling von Binärdateien ausgerichtet, aber einen Versuch soll's wert sein.
Das folgende Script ist als Test für die Bearbeitung einer einzelnen ".fmt"-Datei gedacht. Sollte dabei etwas Vernünftiges herauskommen, können wir uns ja immer noch um die restlichen 9.999 (oder so) kümmern ...
Bitte die Angaben in den Zeilen 2 bis 5 anpassen und unter dem Namen "FMTPatch.vbs" speichern. Zum Testen am Einfachsten eine ".fmt"-Datei auf die Scriptdatei ziehen (Drag & Drop).
Sichtbares Ergebnis sollte zunächst eine MessageBox mit dem alten und dem neuen Pfad sein. Wenn demnach die Verarbeitung möglich war, wurde die ursprüngliche Datei umbenannt (zB von "Test.fmt" auf "Test.fmt.bak") und die neue Datei mit dem geänderten ".bmp"-Pfad im selben Ordner erstellt.
Falls (für das Beispiel der bereitgestellten "Test.fmt") einer der beiden Suchbegriffe "I:\Technik\Etiketten\BMP\" (für den Anfang des alten Pfades) und ".bmp" (für das Ende des alten Pfades) nicht gefunden werden konnte (übrigens: Groß- und Kleinschreibung werden unterschieden!) oder sich daraus ein Pfad von insgesamt mehr als 100 Zeichen Länge ergeben würde, wird eine entsprechende Meldung angezeigt und keine Verarbeitung vorgenommen.
Grüße
bastla
Ich hatte schon befürchtet, dass es mit Batch schwierig werden könnte ...
Die genannte Alternative VBScript ist zwar auch nicht wirklich auf das Handling von Binärdateien ausgerichtet, aber einen Versuch soll's wert sein.
Das folgende Script ist als Test für die Bearbeitung einer einzelnen ".fmt"-Datei gedacht. Sollte dabei etwas Vernünftiges herauskommen, können wir uns ja immer noch um die restlichen 9.999 (oder so) kümmern ...
'FMTPatch.vbs
sBegin = "I:\Technik\Etiketten\BMP\" 'Alter Pfad
sEnd = ".bmp"
sReplace = "I:\Technik\Etiketten\BMP-PLM\" 'Neuer Pfad
iNameLen = 8 'Länge des neuen BMP-Dateinamens (von vorne mit "0" aufgefüllt)
If WScript.Arguments.Count < 1 Then
WScript.Echo "Zu bearbeitende Datei mit vollständigem Pfad als Argument übergeben!"
WScript.Quit(1)
End If
sFile = WScript.Arguments(0)
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(sFile) Then
WScript.Echo "Datei wurde nicht gefunden - bitte mit vollständigem Pfad angeben!"
WScript.Quit(1)
End If
sFileNameExt = fso.GetFile(sFile).Name
If InstrRev(sFileNameExt, ".") Then
sFileName = Left(sFileNameExt, InstrRev(sFileNameExt, ".") - 1)
Else
sFileName = sFileNameExt
End If
sOldFile = sFile & ".bak"
sOldFileName = sFileNameExt & ".bak" '.fmt.bak oder nur .bak (dann ohne Ext)
sNewPath = sReplace & Right(String(iNameLen, "0") & sFileName, iNameLen) & sEnd
'gesamte Datei in binDataOld einlesen
lSize = fso.GetFile(sFile).Size
Set oOldFile = fso.OpenTextFile(sFile, 1)
binDataOld = oOldFile.Read(lSize)
oOldFile.Close
iPos1 = Instr(binDataOld, sBegin)
If iPos1 Then 'Startstring gefunden
iPos2 = Instr(iPos1, binDataOld, sEnd)
If iPos2 Then 'Endstring gefunden
iLen = iPos2 - iPos1 + Len(sEnd)
If iLen <= 100 Then 'Pfadlänge plausibel?
sOldPath = Mid(binDataOld, iPos1, iLen)
'Sicherungskopie erstellen
'ev bereits vorhandene Sicherungskopie löschen
If fso.FileExists(sOldFile) Then fso.DeleteFile(sOldFile)
'Datei umbenennen
Set oOldFile = fso.GetFile(sFile)
oOldFile.Name = sOldFileName
'neue Datei erstellen
Set oNewFile = fso.OpenTextFile(sFile, 2, True)
oNewFile.Write Replace(binDataOld, sOldPath, sNewPath, 1, 1)
oNewFile.Close
'Zur Kontrolle Ausgabe des alten und des neuen Pfades
WScript.Echo sOldPath & " --> " & sNewPath
WScript.Quit
Else
WScript.Echo "Der Suchstring wurde mit einer Länge von " & iLen & " Zeichen ermittelt!", 16
End If
Else
WScript.Echo "Endmarkierung nicht gefunden!", 16
End If
Else
WScript.Echo "Startmarkierung nicht gefunden!", 16
End If
WScript.Quit(1)
Sichtbares Ergebnis sollte zunächst eine MessageBox mit dem alten und dem neuen Pfad sein. Wenn demnach die Verarbeitung möglich war, wurde die ursprüngliche Datei umbenannt (zB von "Test.fmt" auf "Test.fmt.bak") und die neue Datei mit dem geänderten ".bmp"-Pfad im selben Ordner erstellt.
Falls (für das Beispiel der bereitgestellten "Test.fmt") einer der beiden Suchbegriffe "I:\Technik\Etiketten\BMP\" (für den Anfang des alten Pfades) und ".bmp" (für das Ende des alten Pfades) nicht gefunden werden konnte (übrigens: Groß- und Kleinschreibung werden unterschieden!) oder sich daraus ein Pfad von insgesamt mehr als 100 Zeichen Länge ergeben würde, wird eine entsprechende Meldung angezeigt und keine Verarbeitung vorgenommen.
Grüße
bastla