Mit batch-Skript Zeichenkette "zerlegen"
Hi allerseits,
ich habe mir ein kleines Problem selbst eingebrockt und suche nach einer möglichst effizienten Methode, da wieder rauszukommen
Hintergrund ist, dass ich jede Menge Dateien umbenennen möchte, deren Dateinamen alle die gleichen Informationen (Spannung, Temperatur, Laufende Nummer, Beschriftung, sonstiger Text) enthalten, die jeweils durch ein _ getrennt sind. Blöderweise habe ich im Laufe der Zeit die Reihenfolge geändert. Das möchte ich jetzt alles einheitlich machen.
Es gibt also Dateien, die z.B. folgende Form haben:
001_100V_20C_E50_*.*
500V_40C_E105_002_*.*
50C_200V_E53_003_*.*
Letztlich sollen alle Dateien in die Form 001_20C_100V_E52_*.* gebracht werden
Mit der Suchfunktion habe ich schon einfache Beispiele zum Umbenennen von Dateien gefunden, so dass das Grundgerüst schon steht. Aber wie lautet die Syntax, wenn ich mit einem batch-Skript einen String (Dateiname) durchsuchen (jeweils bis zum nächsten '_'), und anschließend rausfinden, ob es sich bei dem zuletzt gelesenen um Temperatur, Spannung, usw. handelt?
Kür wäre übrigens noch, wenn das Skript vor dem Umbenennen die Dateien aus einer zip-Datei extrahieren und anschließend wieder zippen würde. Das würde ich aber notfalls noch per Hand machen.
Gruß und Danke für die Aufmerksamkeit
Calvin
ich habe mir ein kleines Problem selbst eingebrockt und suche nach einer möglichst effizienten Methode, da wieder rauszukommen
Hintergrund ist, dass ich jede Menge Dateien umbenennen möchte, deren Dateinamen alle die gleichen Informationen (Spannung, Temperatur, Laufende Nummer, Beschriftung, sonstiger Text) enthalten, die jeweils durch ein _ getrennt sind. Blöderweise habe ich im Laufe der Zeit die Reihenfolge geändert. Das möchte ich jetzt alles einheitlich machen.
Es gibt also Dateien, die z.B. folgende Form haben:
001_100V_20C_E50_*.*
500V_40C_E105_002_*.*
50C_200V_E53_003_*.*
Letztlich sollen alle Dateien in die Form 001_20C_100V_E52_*.* gebracht werden
Mit der Suchfunktion habe ich schon einfache Beispiele zum Umbenennen von Dateien gefunden, so dass das Grundgerüst schon steht. Aber wie lautet die Syntax, wenn ich mit einem batch-Skript einen String (Dateiname) durchsuchen (jeweils bis zum nächsten '_'), und anschließend rausfinden, ob es sich bei dem zuletzt gelesenen um Temperatur, Spannung, usw. handelt?
Kür wäre übrigens noch, wenn das Skript vor dem Umbenennen die Dateien aus einer zip-Datei extrahieren und anschließend wieder zippen würde. Das würde ich aber notfalls noch per Hand machen.
Gruß und Danke für die Aufmerksamkeit
Calvin
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 19398
Url: https://administrator.de/contentid/19398
Ausgedruckt am: 26.11.2024 um 04:11 Uhr
8 Kommentare
Neuester Kommentar
Moin Calvin,
dann lass uns aber mit den gleichen Informationen starten..
öhhhm.. was kann denn *.* sein?? Sind da auch "_"-Unterstriche drin? Oder Leerzeichen? Oder Punkte (von einem Datumswert)? Kann von Belang sein..
Also (nur um zu sehen, ob ich es verstanden habe):
001_ ..Laufende Nummer, immer dreistellig, ggf. mit führenden Nullen aufzufüllen...
nnC_ vermutlich Grad in Celsius.. Gradangaben sind 0 < Grad <=99? max 2stellige Gradangaben?
nnnV_ Volt, Spannung ... Voltangaben sind 0 < Spannung< 999V ....max dreistellig?
Exxx_ Beschriftung ... xx ist zwei- oder dreistellig? Oder soll auch mit führenden Nullen "dreistellig gemacht" werden?
*.* ...zum Beispiel?
Find ich vorbildlich...
so dass das Grundgerüst schon steht.
Wo steht das? Ich seh nix...
Im Prinzip mit einer FOR/F ..IN ..DO..-Konstruktion und einem "_" als Trennzeichen. Zeig ich Dir noch.
Tja.. Jonglieren mit Variablen.. machen wir dann.
..nun mal nicht gierig werden...
Wenn Du verrätst, was Du als Zipper nimmst und was der für Parameter braucht...
Gibt es denn ein ALT-Directory, wo jetzt die Zips drin sind? Eins zum Arbeiten? Eins für die neuen Zips?
Eins für alle bla_bla_bla_*.* Dateien in entzippter Form?
Ach was, so schlimm wirds schon nicht werden.
Grüße Biber
dann lass uns aber mit den gleichen Informationen starten..
001_100V_20C_E50_*.*
500V_40C_E105_002_*.*
50C_200V_E53_003_*.*
500V_40C_E105_002_*.*
50C_200V_E53_003_*.*
Letztlich sollen alle Dateien in die Form 001_20C_100V_E52_*.* gebracht werden
001_ ..Laufende Nummer, immer dreistellig, ggf. mit führenden Nullen aufzufüllen...
nnC_ vermutlich Grad in Celsius.. Gradangaben sind 0 < Grad <=99? max 2stellige Gradangaben?
nnnV_ Volt, Spannung ... Voltangaben sind 0 < Spannung< 999V ....max dreistellig?
Exxx_ Beschriftung ... xx ist zwei- oder dreistellig? Oder soll auch mit führenden Nullen "dreistellig gemacht" werden?
*.* ...zum Beispiel?
Mit der Suchfunktion habe ich schon einfache Beispiele zum Umbenennen von Dateien gefunden,
so dass das Grundgerüst schon steht.
Wo steht das? Ich seh nix...
Aber wie lautet die Syntax, wenn ich mit einem batch-Skript einen String (Dateiname) durchsuchen (jeweils bis zum nächsten '_'),
und anschließend rausfinden, ob es sich bei dem zuletzt gelesenen um Temperatur, Spannung, usw. handelt?
Kür wäre übrigens noch,
wenn das Skript vor dem Umbenennen die Dateien aus einer zip-Datei extrahieren und anschließend wieder zippen würde.
Gibt es denn ein ALT-Directory, wo jetzt die Zips drin sind? Eins zum Arbeiten? Eins für die neuen Zips?
Eins für alle bla_bla_bla_*.* Dateien in entzippter Form?
Das würde ich aber notfalls noch per Hand machen.
Grüße Biber
Danke, Calvin,
für die ausführliche Antwort.
Jetzt ist es nicht mehr ganz so schwammig (kein Vorwurf, aber ein Außenstehender kann nicht alle Rahmenbedingingen kennen, die Dir "selbstverständlich" sind).
Ich meinte damit: Im Moment liegen sicherlich die Zip-Dateien in einem Ordner (Beispiel: "X:\Messungen").
In diesen Zip-Dateien sind alle Einzeldateien im "alten", im heutigen Namensformat.
Laut Plan & Theorie werden die Einzeldateien entpackt (uuups-Nr-1, und wenn in zwei *.Zips eine gleichnamige Datei ist??) und dann umbenannt.
Uuuups-Nr-2 ... und wenn da Dateinamenskollisionen auftreten? Nicht dass uns da eine Datei verloren geht...
Wenn dann alle Dateien umbenannt worden sind... wie ist dann die Zip-Mimik? Gab es vorher drei Zip-Dateien ZipA.zip, ZipB.zip, ZipC.zip und sollen jeweils die darin enthaltenen Dateien danach un eine ZipA_neu.zip, ZipB_neu.zip und ZipC_neu.zip?? Oder das ganze Geraffel in eine große ZIP-Datei??
Oder lieber doch erstmal alle Einzel-Dateien in einem (Extra-)Ordner liegen lassen und die Zipperei als Extra-Batch-Mimik machen?
An der Stelle kann es sein, dass Du (fachlich und inhaltliche) Anforderungen hast - kann ich aber nicht wissen.
Die Umbenennerei.. okay, da kenn ich halbwegs die Linie.. nach welchen Kriterien Du alles Zippen willst.. na ja, hat auch noch einen Tag Zeit.
Zu Deiner Frage, ob und wie sich z.B. Winzip via CMD-Line aufrufen lässt... *achselzuck*... recherchieren. Zur Not gibt es ja Pkzip/Pkunzip o.ä. vom CMD aufrufbare Freeware-Tools, die ja schließlich das ZIP-Format erst verbreitet haben. Die sind also sicherlich "Zip-kompatibel".
Zur Frage, was "For /F ..IN..DO" macht... siehe "FOR /?" oder in den Tutorials in "Batch & Shell"
Ich schau mir Deinen Krams mal am Wochenende an.
Grüße Biber
für die ausführliche Antwort.
Jetzt ist es nicht mehr ganz so schwammig (kein Vorwurf, aber ein Außenstehender kann nicht alle Rahmenbedingingen kennen, die Dir "selbstverständlich" sind).
Gibt es denn ein ALT-Directory, wo jetzt die Zips drin sind?
Eins zum Arbeiten?
Eins für die neuen Zips?
Eins für alle bla_bla_bla_*.* Dateien in entzippter Form?
Eins zum Arbeiten?
Eins für die neuen Zips?
Eins für alle bla_bla_bla_*.* Dateien in entzippter Form?
Was meinst du damit? Es gibt ein Verzeichnis, in dem die zip-Dateien sind. Sonstige Verzeichnisse anlegen soll nicht das Problem sein
Ich meinte damit: Im Moment liegen sicherlich die Zip-Dateien in einem Ordner (Beispiel: "X:\Messungen").
In diesen Zip-Dateien sind alle Einzeldateien im "alten", im heutigen Namensformat.
Laut Plan & Theorie werden die Einzeldateien entpackt (uuups-Nr-1, und wenn in zwei *.Zips eine gleichnamige Datei ist??) und dann umbenannt.
Uuuups-Nr-2 ... und wenn da Dateinamenskollisionen auftreten? Nicht dass uns da eine Datei verloren geht...
Wenn dann alle Dateien umbenannt worden sind... wie ist dann die Zip-Mimik? Gab es vorher drei Zip-Dateien ZipA.zip, ZipB.zip, ZipC.zip und sollen jeweils die darin enthaltenen Dateien danach un eine ZipA_neu.zip, ZipB_neu.zip und ZipC_neu.zip?? Oder das ganze Geraffel in eine große ZIP-Datei??
Oder lieber doch erstmal alle Einzel-Dateien in einem (Extra-)Ordner liegen lassen und die Zipperei als Extra-Batch-Mimik machen?
An der Stelle kann es sein, dass Du (fachlich und inhaltliche) Anforderungen hast - kann ich aber nicht wissen.
Die Umbenennerei.. okay, da kenn ich halbwegs die Linie.. nach welchen Kriterien Du alles Zippen willst.. na ja, hat auch noch einen Tag Zeit.
Zu Deiner Frage, ob und wie sich z.B. Winzip via CMD-Line aufrufen lässt... *achselzuck*... recherchieren. Zur Not gibt es ja Pkzip/Pkunzip o.ä. vom CMD aufrufbare Freeware-Tools, die ja schließlich das ZIP-Format erst verbreitet haben. Die sind also sicherlich "Zip-kompatibel".
Zur Frage, was "For /F ..IN..DO" macht... siehe "FOR /?" oder in den Tutorials in "Batch & Shell"
Ich schau mir Deinen Krams mal am Wochenende an.
Grüße Biber
@Calvin
>Puh, da denkt man, man hätte alles bis ins Kleinste beschrieben und schon kommt ein Außenstehender und findet immer noch Unklarheiten
Na, hör ma... wenn Du das gleich vernünftig beschrieben hättest, hätten wir schon vor Tagen anfangen können ..
Nein, im Ernst - ich finde Deine Problembeschreibung vorbildlich und werde auch ggf. darauf verweisen von anderen Threads aus.
Meine Erfahrung ist nun mal - je länger und genauer die Analyse und Zielanforderung vor dem Eintippen der ersten Code-Zeile, desto kürzer und robuster wird der Code. Und desto schneller passt die Lösung auch.
Hier im Forum gibt es leider manchmal die gegenteiligen Extreme - das Problem wird beschrieben als "wie kann ich eine IP ermitteln?" und nach dreimal Hin- und Herposten stellt sich heraus, dass ein Konkurrenzprodukt zu DynDys entwickelt werden soll oder ähnliches.
Also danke fürs geduldige Erklären.
Grüße
Biber
>Puh, da denkt man, man hätte alles bis ins Kleinste beschrieben und schon kommt ein Außenstehender und findet immer noch Unklarheiten
Na, hör ma... wenn Du das gleich vernünftig beschrieben hättest, hätten wir schon vor Tagen anfangen können ..
Nein, im Ernst - ich finde Deine Problembeschreibung vorbildlich und werde auch ggf. darauf verweisen von anderen Threads aus.
Meine Erfahrung ist nun mal - je länger und genauer die Analyse und Zielanforderung vor dem Eintippen der ersten Code-Zeile, desto kürzer und robuster wird der Code. Und desto schneller passt die Lösung auch.
Hier im Forum gibt es leider manchmal die gegenteiligen Extreme - das Problem wird beschrieben als "wie kann ich eine IP ermitteln?" und nach dreimal Hin- und Herposten stellt sich heraus, dass ein Konkurrenzprodukt zu DynDys entwickelt werden soll oder ähnliches.
Also danke fürs geduldige Erklären.
Grüße
Biber
So, Calvin,
eine kurze Skizze hätte ich.. einiges wäre kürzer gegangen, aber ich wollte es lesbar halten.
Der Output von diesem Schnipsel wäre:
Die Zipperei/Entzipperei habe ich weggelassen... da warte ich, bis Du einen Zipper hast, der sich via CMD-Line aufrufen lässt und der lange Dateinamen kann.
Die älteren, die ich noch bei mir auf dem Rechner habe, können zum Teil nur die "8.3-Namenskonvention".
Aber z.B. ARJ.exe (letzte bekannte Adresse in meiner alten Version: robjung@world.std.com) erlaubt sogar das Umbenennen von Datei im Archiv... wenn Du so ein Teil auftreibst, ist sogar das temporäre Entpacken/Packen unnötig.
So, ich mach mir erstmal ein Becks auf.
Schönen Abend
Biber
eine kurze Skizze hätte ich.. einiges wäre kürzer gegangen, aber ich wollte es lesbar halten.
::-------Snipp FileRenamer.bat.
@echo off & setlocal
Set "oldZipDir=Z:" && rem Da sind die heutigen Zips
Set "newZipDir=Z:\newZipDir" && rem Da kommen die neuen hin
Set "workDir=Z:\temp" && rem da benennen wir um
for %%i in (%workdir% %newZipDir%) do If not exist %%i md %%i
for /f %%i in ('dir /b /A:<dummy>-D %oldzipDir%\*.zip') do call :entpacken "%%~dpnxi" %workdir%
goto :eof
~~~~~~~~
:entpacken
:: Entpacke %~1 in WorkDir %2........ den machen wir später
Echo [Simulation] Entpacke %~1 in WorkDir %2
:: Wechsel in das Verzeichnis_in_das_entpackt_wurde
PushD %2
for %%j in (*.*) do call :process1file %%j
Echo [Simulation] Dateien wieder zippen ...machen wir später
PopD
:: Wechsel ins das Verzeichnis_vorher (?? das mit_den_zip_Files?)
::Zurück zur aufrufenden FOR-Schleife
goto :eof
~~~~~~~~~
Die Testdatenfälle/Testdateinamen in %workdir:
001_100V_20C_E50_bla.txt
001_100V_20C_E50_blubb.txt
001_100V_20C_E50_blubb_4711.gif
100V_250C_004_E50_0815.gif
100V_250C_004_E50_0815.txt
E605_300V_50C_007_heinz.txt
E605_300V_50C_007_hugo.txt
~~~~~~~
:process1file
:: Parameter %1 ist der "alte" Dateiname...
For %%i in (lfdnr U T E Rest dummy) do set "%%i="
For /F "tokens=1-4* delims=_" %%a in ("%~n1") do (
(set "rest=%%e%~x1") & For %%x in (%%a %%b %%c %%d) do call :sortIt %%x
)
Echo INFile=%1
Echo ....Nebenrechnung: E=%E% U=%U% T=%T% LfdNr=%LfdNr% Rest=%Rest%
echo OUTFile: %LfdNr%_%T%_%U%_%E%_%Rest% [Ergebnis-Simulation]
echo.
:: UNCOMMENT LATER Set "DateinameNeu=%LfdNr%_%T%_%U%_%E%_%Rest%"
:: UNCOMMENT LATER Rename %1 %DateinameNeu%
goto :eof
~~~end of process1file
~~~~~~~
:sortIt
Set "Dummy=%1"
:: echo Dummy %dummy% par1:%1
IF /i [%Dummy:~-1,1%]==[V] (
set "U=%Dummy%"
goto :eof
)
IF /i [%Dummy:~-1,1%]==[C] (
set "T=%Dummy%"
goto :eof
)
IF /i [%Dummy:~0,1%]==[E] (
set "E=%Dummy%"
goto :eof
)
set "LfdNr=%Dummy%"
goto :eof
~~~~~~~end of sortIt
::---end of FileRename.bat
> FileRenamer.bat
[Simulation] Entpacke Z:\test.zip in WorkDir Z:\temp
INFile=001_100V_20C_E50_bla.txt
....Nebenrechnung: E=E50 U=100V T=20C LfdNr=001 Rest=bla.txt
OUTFile: 001_20C_100V_E50_bla.txt [Ergebnis-Simulation]
INFile=001_100V_20C_E50_blubb.txt
....Nebenrechnung: E=E50 U=100V T=20C LfdNr=001 Rest=blubb.txt
OUTFile: 001_20C_100V_E50_blubb.txt [Ergebnis-Simulation]
INFile=001_100V_20C_E50_blubb_4711.gif
....Nebenrechnung: E=E50 U=100V T=20C LfdNr=001 Rest=blubb_4711.gif
OUTFile: 001_20C_100V_E50_blubb_4711.gif [Ergebnis-Simulation]
INFile=100V_250C_004_E50_0815.gif
....Nebenrechnung: E=E50 U=100V T=250C LfdNr=004 Rest=0815.gif
OUTFile: 004_250C_100V_E50_0815.gif [Ergebnis-Simulation]
INFile=100V_250C_004_E50_0815.txt
....Nebenrechnung: E=E50 U=100V T=250C LfdNr=004 Rest=0815.txt
OUTFile: 004_250C_100V_E50_0815.txt [Ergebnis-Simulation]
INFile=E605_300V_50C_007_heinz.txt
....Nebenrechnung: E=E605 U=300V T=50C LfdNr=007 Rest=heinz.txt
OUTFile: 007_50C_300V_E605_heinz.txt [Ergebnis-Simulation]
INFile=E605_300V_50C_007_hugo.txt
....Nebenrechnung: E=E605 U=300V T=50C LfdNr=007 Rest=hugo.txt
OUTFile: 007_50C_300V_E605_hugo.txt [Ergebnis-Simulation]
INFile=test.zip
....Nebenrechnung: E= U= T= LfdNr=test Rest=.zip
OUTFile: test____.zip [Ergebnis-Simulation]
[Simulation] Dateien wieder zippen ...machen wir später
Die älteren, die ich noch bei mir auf dem Rechner habe, können zum Teil nur die "8.3-Namenskonvention".
Aber z.B. ARJ.exe (letzte bekannte Adresse in meiner alten Version: robjung@world.std.com) erlaubt sogar das Umbenennen von Datei im Archiv... wenn Du so ein Teil auftreibst, ist sogar das temporäre Entpacken/Packen unnötig.
So, ich mach mir erstmal ein Becks auf.
Schönen Abend
Biber
Moin, Calvin,
sorry, ich war wohl etwas sparsam mit den Kommentaren.
wenn etwas in einfachen Anführungszeichen steht, ist es ein Programmaufruf, der den Output, also den Part für die DO-Anweisung liefern soll. Hier wird also DIR aufgerufen.
DIR /b ... /b liefert nur die nackten Dateinamen, ohne Uhrzeit, Größe etc.
/A:D würde nur alle Dateien mit "A"=Attribut "D"=Directory liefern. Ich will das Gegenteil - Nur alle mit Attribut "kein Directory", also "/A:<dummy>-D".
Ist bei Dir nicht nötig... in meinem Test-Directory gestern hatte ich Unterverzeichnisse *gg
%oldzipDir%\*.zip ich will den DIR-Befehl ja nur anwenden auf alle ZIP-Dateien in %oldzipDir%
Anmerkung zu :process1file
Das Setzen des neuen Names mit "Set DateinameNeu=.." hatte ich noch aus Deiner Vorlage übernommen. Nötig ist dieser Zwischenschritt nicht. Kann auch direkt in die Rename-Zeile eingearbeitet werden. Also da, wo jetzt "Set DateinameNeu=" steht, statt dessen das "Rename %1" hinschreiben.
Habe gestern parallel zu Deinem Hefeweizen ein Becks getrunken...
.. aber ich lasse mich GERN zu Hefeweizen überreden. Ich liebe Berührungen mit fremden Kulturwelten..
Schönen Sonntag noch
Biber
sorry, ich war wohl etwas sparsam mit den Kommentaren.
for /f %%i in ('dir /b /A:<dummy>-D %oldzipDir%\*.zip') do call :entpacken "%%~dpnxi" %workdir%
Was bedeutet das in der Klammer?
('dir /b /A:<dummy>-D %oldzipDir%\*.zip')wenn etwas in einfachen Anführungszeichen steht, ist es ein Programmaufruf, der den Output, also den Part für die DO-Anweisung liefern soll. Hier wird also DIR aufgerufen.
DIR /b ... /b liefert nur die nackten Dateinamen, ohne Uhrzeit, Größe etc.
/A:D würde nur alle Dateien mit "A"=Attribut "D"=Directory liefern. Ich will das Gegenteil - Nur alle mit Attribut "kein Directory", also "/A:<dummy>-D".
Ist bei Dir nicht nötig... in meinem Test-Directory gestern hatte ich Unterverzeichnisse *gg
%oldzipDir%\*.zip ich will den DIR-Befehl ja nur anwenden auf alle ZIP-Dateien in %oldzipDir%
Anmerkung zu :process1file
Das Setzen des neuen Names mit "Set DateinameNeu=.." hatte ich noch aus Deiner Vorlage übernommen. Nötig ist dieser Zwischenschritt nicht. Kann auch direkt in die Rename-Zeile eingearbeitet werden. Also da, wo jetzt "Set DateinameNeu=" steht, statt dessen das "Rename %1" hinschreiben.
Habe gestern parallel zu Deinem Hefeweizen ein Becks getrunken...
.. aber ich lasse mich GERN zu Hefeweizen überreden. Ich liebe Berührungen mit fremden Kulturwelten..
Schönen Sonntag noch
Biber