iceman
Goto Top

Batch - Dateiname umbenennen, Dateigröße anhängen am Ende des Namens

Hallo,

ich möchte eine oder mehrere Dateien unbennen.
Es soll im Dateinamen, am Ende die Dateigröße eingefügt werden.

Batch - Dateiname umbenennen, Dateigröße anhängen am Ende des Namens

Das soll so aussehen, zum Beispiel.

Originaldatei(en):
C:\TEST\bild.jpg

Neue unbenannte Datei(en):
Variante 1
C:\TEST\bild_2.2MB.jpg

Variante 2
C:\TEST\bild-2.20MB.jpg

Variante 3
C:\TEST\bild.2.20MB.jpg

(KB,MB,GB,TB hätte ich gern als Angabe, die aber Sinnvoll automatisch gewählt wird, je nach dem, wie groß die Datei ist.)

Wenn dies aber zu kommpliziert ist, würde ich mich auch mit einem Tool zufrieden geben.

Vielen Dank im voraus.

Gruß Iceman(chen´)

PS. Gegenstück zm Ordner Batch - Ordnername umbenennen, Ordnergröße anhängen am Ende des Namens
Kommentar vom Moderator Biber am 30.03.2011 um 17:15:01 Uhr
Zitat von @Iceman:
ich möchte eine oder mehrere Dateien unbennen.
set /a rgc+=1
#739

Zitat von @MrNetman:
Wie wäre es mit xnview?
Der Umbennen-Dialog kann den alten Dateinamen behalten,
set /a rgc+=1
#740

Content-ID: 163616

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

Ausgedruckt am: 15.11.2024 um 01:11 Uhr

Skyemugen
Skyemugen 30.03.2011 um 10:38:16 Uhr
Goto Top
Aloha,

eine oder mehrere, genau da liegt der Hase im Pfeffer - möglich wäre es z.B. per dir ein Verzeichnis auszulesen und z:B. alle .jpg zu erfassen und umzubenennen aber man könnte natürlich auch das ganze per drag&drop machen (wo man dann entweder eine oder mehrere Dateien auf die Batch zieht wobei ich momentan die Dateigröße aus dir beziehen würde ... hm.

Wäre also schon gut zu wissen, in welche Richtung man das umsetzen möchte. =)

greetz André
Iceman
Iceman 30.03.2011 um 10:46:40 Uhr
Goto Top
Hallo André,

Es geht um mehrere Dateien, meine Bilder- und Musikdateien.

Variante "mehrere" bitte face-smile

Gruß Ice
bastla
bastla 30.03.2011 um 11:07:06 Uhr
Goto Top
Hallo Iceman und willkommen im Forum!

Das könnte etwa so gehen:
@echo off & setlocal
set "Ordner=C:\TEST"  

set "Einh=B KB MB GB TB"  
pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d') do call :ProcessFile "%%i"  
popd
pause
goto :eof

:ProcessFile
set /a G=%~z1
set /a D=0
set /a N=1
:Loop
if %G% lss 1000 goto :Done
set /a D=G %% 1000
set /a G=G/1000
set /a N+=1
goto :Loop

:Done
for /f "tokens=%N%" %%i in ("%Einh%") do set "E=%%i"  
set "NameNeu=%~n1_%G%.%D%%E%%~x1"  
echo ren %1 "%NameNeu%"  
goto :eof
Zum Testen werden (wegen des "echo" vor dem "ren") die Umbenenn-Befehle vorerst nur angezeigt.

Der Einfachheit halber (und da Du ja auch nicht "KiB" oder "MiB" gewünscht hast) wird mit dem Faktor 1000 umgerechnet.

Zu beachten wäre noch, dass die höchste in der CMD-Shell verrechenbare positive Zahl 2^31-1 ist.

Grüße
bastla
MrNetman
MrNetman 30.03.2011 um 11:11:35 Uhr
Goto Top
Wie wäre es mit xnview?
Der Umbennen-Dialog kann den alten Dateinamen behalten, Datum aus EXIF holen, Dateigrößen dazu schreiben, eigene Texte ergänzen, ....
Beispiel: Bild-###-<Size auto>-<Date Taken [Y-m-d_H-M]>
Die Bildnummer wird dreistelig hochgezählt. Die Größe wir asl Dateiname zugefügt und das Aufnahmedatum wird auf die Minute genau dokumentiert. ICh würde die Reihenfolge umstellen:
<Date Taken [Y-m-d_H-M]>-<Size auto>-<Filename>
Dann fällt die Bildnummerierung weg, die ja nicht eindeutig ist.
Und um den Vorgang zu starten läßt man xnView einfach Verzeichnisübergreifend suchen.
Kleiner Nachteil der Flexibilität: Der Vorgang dauert etwas.
Für Musikdateien kann ich Ant Renamer empfehlen.
Wenn es bei der Musik etwas flexibler sein soll gibt es noch MP3TAG.

viel Erfolg
Skyemugen
Skyemugen 30.03.2011 um 11:16:36 Uhr
Goto Top
Aloha bastla!

*mampf* da ist man mal kurz was zum Schnabulieren holen *mampf* und hat gerade seinen Weg angefangen zu gehen *mampf* ... da guckt man kurz hier wieder rein und merkt Ok, hat sich wohl schon erledigt. *mampf*
Egal, ich baue trotzdem mal weiter (hatte momentan zwei Varianten am Entwickeln: Größe per dir gleich mitziehen lief nicht wirklich auf Dauer und die letzten zwei Zeilen störten oder per %%~zi), mal gucken, ob ich's auch gebacken apropros *mampf* bekomme ;)

Grüße, André

edit: Ob ich in diesem Fall noch eine Variante posten werde, weiß ich noch nicht - ein gutes Beispiel dafür, dass ich merke, ich habe noch so viel zu lernen *g*
Iceman
Iceman 30.03.2011 um 11:18:20 Uhr
Goto Top
@bastla

hey

Vielen Dank und danke für die nette Begrüßung.
Ich teste das heut Abend und berichte dann.

Gruß Ice


@MrNetman

Hey auch dir danke ich für die Tipps.
Die Tools teste ich doch glatt.

Übrigens, möchte ich das auch für mkv-Dateien nutzen (im Durchschnitt 4.00GB bis 20.00GB groß)
Gruß Ice
Iceman
Iceman 30.03.2011 um 11:20:07 Uhr
Goto Top
Hi André (nochmal) face-smile

Ja gerne, ich bin auf deine Variante (n) gespannt.

Gruß Ice
and thx
Iceman
Iceman 30.03.2011 um 11:55:30 Uhr
Goto Top
Hey bastla,

das funktioniert, wenn ich das echo aus Zeile 25 entferne.
Zwischenfazit: find ich richtig gut und super von dir.

Jetzt die Frage, wie passe ich den Code so an, das immer die jeweilige Größe erkannt wird und dementsprechend im Namen als B, KB ,MB ,GB oder TB angezeigt wird.
Gut wäre dann auch, wenn diese Angaben, allg auf 2 Stellen hinter dem Komma gekürzt sind. (Wenn das nicht geht, wäre auch ok)

Die automatische angepasste Angabe der Größe wäre schon super, so kann ich diese batch später für Fotos, Musikfiles und Videofiles nutzen.

Gruß Ice
Iceman
Iceman 30.03.2011 um 13:47:50 Uhr
Goto Top
Hallo MrNetman,

Hey auch dir danke ich für die Tipps.
Die Tools teste ich doch glatt, wenn ich zu Hause bin.

Übrigens, möchte ich das auch für mkv-Dateien nutzen (im Durchschnitt 4.00GB bis 20.00GB groß)
Gruß Ice
bastla
bastla 30.03.2011 um 15:11:47 Uhr
Goto Top
Hallo Iceman!
Jetzt die Frage, wie passe ich den Code so an, das immer die jeweilige Größe erkannt wird und dementsprechend im Namen als B, KB ,MB ,GB oder TB angezeigt wird.
Überrascht mich etwas, da ja eigentlich schon enthalten ...
Wenn es nur 2 Dezimalen sein sollen, die Zeile 24 auf
set "NameNeu=%~n1_%G%.%D:~0,2%%E%%~x1"
ändern.
Für Dateien mit mehr als 2.147.483.647 Byte Größe ist der Batch so nicht verwendbar (da mit größeren Zahlen nicht gerechnet werden kann) - da Du aber ohnehin die letzten 7 Stellen nicht benötigst, werde ich das nachher per String-Verarbeitung hinbasteln ...

Grüße
bastla
Skyemugen
Skyemugen 30.03.2011 um 16:03:21 Uhr
Goto Top
Aloha bastla, (erneut)

ich habe da wirklich mal eine Funktionsfrage im Ablauf:
for /f "delims=" %%i in ('dir /b /a-d') do call :ProcessFile "%%i"
:ProcessFile
set /a G=%~z1

Man liest die Dateigröße aus dem Parameter %1 aus, der von %%i gegeben wird, ich blick's einfach nicht wie die batch nacheinander alle Zeilen des dir abklappert und nicht immer denselben ausgibt ...
Ich habe anfangs versucht genau diese Ausgabe per %%~zi zu erhalten per echo geht ja, logischerweise aber da kann ich natürlich dann nicht set /a G=%%~zi machen klar, nen ganzen Text als Variable definieren wird wohl kaum funktionieren, daher versteh ich in diesem Punkt nicht genau, wie die batch die gegebenen Informationen nun eigentlich einzeln (über %1) abarbeitet (und man diese dadurch in eine Variable G definieren kann).

Das ist eine Situation, wo ich mich schon mehrfach geschlagen geben musste, weil ich nicht wusste, dass ich den Gesamtinhalt einzeln doch so einfach abarbeiten kann.

Grüße, André
bastla
bastla 30.03.2011 um 16:11:32 Uhr
Goto Top
Hallo Skyemugen!

Das Unterprogramm (kannst Du wie einen neuen Batch betrachten) wird für jede Datei (entspricht in diesem Fall einem "Objekt", da der Pfad nach dem "pushd" ja nicht mehr benötigt wird) aufgerufen; dort kommt die Datei als "%1" an, und Du kannst alle erweiterten Variablen verwenden (also auch "%~z1" für die Größe).

Wolltest Du das ohne Unterprogramm durchführen, müsstest Du für die Verwendung von %G% "delayedExpansion" (und daher !G!) einsetzen ...

Grüße
bastla
Skyemugen
Skyemugen 30.03.2011 um 16:31:45 Uhr
Goto Top
Aloha bastla!

Ach, so ist das, gut, wieder was dazu gelernt also auch in diesem Fall dann delayedexpansion, verstehe (muss noch bisschen daran arbeiten, wann ich das benötige und wann nicht ohne immer endlos rumzutesten *g*). Ich hatte bei mir eh kein pushd drin (werde mich wohl nie daran gewöhnen, das mal einzusetzen), sondern hatte wie bei mir üblich den Pfad als %Quelle% im dir enthalten.

Hm klar, wenn der durch call aufgerufene Prozess wie eine neue batch betrachtet werden kann, sieht das natürlich dann schon anders aus.

Ich danke dir für die Erklärung =) Das wird mir generell beim Bätscheln weiterhelfen.

Grüße, André
bastla
bastla 30.03.2011 um 16:52:03 Uhr
Goto Top
Hallo Iceman!

Mit dem Workaround für mind GB-große Dateien (die Berücksichtigung von TB-Dateigrößen spare ich mal vorläufig ein) sollte es klappen:
@echo off & setlocal
set "Ordner=C:\TEST"  

set "Einh=B KB MB GB"  
pushd "%Ordner%"  
for /f "delims=" %%i in ('dir /b /a-d') do call :ProcessFile "%%i"  
popd
pause
goto :eof

:ProcessFile
set "G=%~z1"  
:: bei mehr als 9-stelliger Dateigröße Sonderbehandlung
if "%G:~9%" neq "" goto :GBorMore  
set /a D=0
set /a N=1
:Loop
if %G% lss 1000 goto :Done
set /a D=G %% 1000
set /a G=G/1000
set /a N+=1
goto :Loop

:GBorMore
:: zuerst die letzten 6 Stellen abschneiden,
set "G=%G:~0,-6%"  
:: dann die letzten 3 Stellen als Dezimalanteil behandeln und
set "D=%G:~-3%  
::  den Teil davor als ganzzahligen Anteil festlegen
set "G=%G:~0,-3%  
:: sowie die Einheit auf GB setzen
set E=4

:Done
for /f "tokens=%N%" %%i in ("%Einh%") do set "E=%%i"  
:: im neuen Namen nur die ersten beiden Stellen des Dezimalanteils verwenden
set "NameNeu=%~n1_%G%.%D:~0,2%%E%%~x1"  
echo ren %1 "%NameNeu%"  
goto :eof
Iceman
Iceman 31.03.2011 um 10:47:45 Uhr
Goto Top
Hey bastla, Guten Morgen.

Vielen vielen Dank auch dafür.
Das klappt wunderbar.

Ich ziehe meinen Hut.

Kleine Frage!
Ist das mit diesem Code nun möglich auch große Dateien umzubennen mit der Größenangabe?
Und kann man den Code auch für Ordner umstellen.
Wenn ja, würde ich eine neue Frage starten, bezogen auf Ordner.

Gruß Ice
bastla
bastla 31.03.2011 um 11:34:24 Uhr
Goto Top
Hallo Iceman!
Ist das mit diesem Code nun möglich auch große Dateien umzubennen mit der Größenangabe?
Lässt sich doch sicher leicht testen (und wozu wäre sonst der "Workaround für mind GB-große Dateien" gut?) ...
Und kann man den Code auch für Ordner umstellen.
Abgesehen davon, dass die Ordnergröße ja eher dynamisch sein wird: Welche Größe ist gemeint (nur Dateien dieses Ordners oder auch der Unterordner)? So oder so lässt sich die Größe eines Ordners nicht per "%~zi" auslesen ...

Grüße
bastla
Skyemugen
Skyemugen 31.03.2011, aktualisiert am 18.10.2012 um 18:46:18 Uhr
Goto Top
Aloha bastla!

Schade, stimmt, kommt immer 0 bei raus aber dann müsste sich eventuell mit der Hilfe des Bibers eine andere Möglichkeit finden lassen ... und als nächstes will er dann die Größe der Laufwerke auslesen *gg*

greetz André
bastla
bastla 31.03.2011 um 11:55:58 Uhr
Goto Top
Hallo Skyemugen!

Ist ja beides kein Problem (ein dir /-c|findstr "Datei(en)" mit oder ohne "/s" - und für Optimierer mit "/w" face-wink - genügt ja schon als Basis) - es sollte aber zuerst einmal geklärt sein, was überhaupt die Zielsetzung ist (und der Sinn dahinter wäre auch nicht uninteressant) ...

Grüße
bastla
Iceman
Iceman 31.03.2011, aktualisiert am 18.10.2012 um 18:46:18 Uhr
Goto Top
Hi bastla und Skyemugen and the Rest vom Schützenfest

ich denke ...Skyemugen , du meinst mich face-smile

Also

ich habe hunderte Ordner die so aussehen.

Ordner ALT:
ZHLU00087_BLACK AND WHITE_2008_XCY_ght_0001
IJHK00098_SCHUH BALL FAHRRAD_JHG_kij_0002

Ordner NEU:
ZHLU00087_BLACK AND WHITE_2008_XCY_ght_0001_12.98GB
IJHK00098_SCHUH BALL FAHRRAD_JHG_kij_0002_252.87MB

So hätte ich sofort den Überblick, über die Größe und kann anschließend daraus Dateien (txt´s) anlegen die dann so aussehen.

Datei aus Ordnername:
ZHLU00087_BLACK AND WHITE_2008_XCY_ght_0001_12.98GB.txt
IJHK00098_SCHUH BALL FAHRRAD_JHG_kij_0002_252.87MB.txt

Dann kann ich die txt´s an jemandem Schicken, der vorab weis worum es geht und kann auf dem ersten Blick sehen, wie groß die Ordner bei mir real sind.

Der jenige Antwort dann mit der txt die er haben möchte als Ordner und ich geben den Ordner im Netzwerk (zum Bsp) frei.

Reicht euch die Erklärung?

Grüße Ice face-smile

PS. die Größe soll vom kompletten Ordner ausgelesen werden, mit allen Dateien, in allen Ordnern. wichtig!

EDIT: ich habe eine neue Frage dazu erstellt. Batch - Ordnername umbenennen, Ordnergröße anhängen am Ende des Namens
Bitte führt die Ordnervariante dort weiter. Danke