heppy225
Goto Top

Batchdatei - Dateigrösse formatiert ausgeben

Hallo erstmal,
bin zum ersten Mal im Forum und bin begeistert was ich hier alles finden und lernen kann.

Zur Sache: ein Problem mit einer kleinen Batch-Datei unter WinXP.

Ich brauche eine Batch Datei, die mir die formatierte (1000 Punkte) Dateigröße an den Dateinamen anhängt.

Ich habe einen Code gefunden (Dank an bastla) der das Anhängen und Umbennen erledigt.
Leider finde ich keine Information über das Wie unterschiedliche Dateigrößen zu formatieren (123456789 ->123.456.789)


Hier das bisherige Ergebnis:

@echo off & setlocal
set "Ordner=C:\_Backup\Test"

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

:ProcessFile
set "G=%~z1"

set "NameNew=%~n1_%G%%~x1"
echo ren %1 "%NameNew%"
goto :eof

Bin für jeden Tip dankbar

Vielen Dank im Voraus

MfG
Kommentar vom Moderator Biber am May 15, 2011 um 12:53:01 Uhr
...der das Anhängen und Umbennen erledigt.
set /a rgc+=1
#755

Content-Key: 166270

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

Printed on: April 19, 2024 at 20:04 o'clock

Member: ovu-p86
ovu-p86 May 15, 2011 at 03:45:47 (UTC)
Goto Top
Hallo Heppy225,

wenn du unter :ProcessFile
set "G=%~z1"  
durch
for /F "usebackq tokens=3 delims= " %%a in (`dir /d /c %1^| findstr "Datei(en)"`) do set G=%%a  
ersetzt, klappt es.
Kann man wahrscheinlich eleganter machen, aber funktioniert.

Gruß
Uwe
Member: bastla
bastla May 15, 2011 at 06:09:03 (UTC)
Goto Top
@ovu-p86
Kann man wahrscheinlich eleganter machen
Eher effiizienter (wäre schon bei der "Originalversion" oben möglich und sinnvoll gewesen) - anstelle eines zusätzlichen "dir" für jede einzelne Datei gleich:
@echo off & setlocal
set "Ordner=C:\_Backup\Test"  

pushd "%Ordner%"  
for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c^|findstr /v "Datei(en) Verzeichnis(se)"') do echo ren "%%d" "%%~nd_%%c%%~xd"  
popd
pause
Der Schalter "/c" beim "dir" sollte eigentlich nicht nötig sein (Default), schadet aber auch nicht ...
Anmerkungen zu Deiner "for /f"-Schleife: "usebackq" verwende ich eigentlich nur, wenn ich einen Dateinamen unter Anführungszeichen angeben will (für Befehle genügen Apostrophe), und Leerzeichen und TAB sind Default-"Delimiter" ...

Grüße
bastla

P.S.: Bevor ich's vergesse:
Willkommen, Heppy225, im Forum! face-smile
Member: Heppy225
Heppy225 May 15, 2011 at 07:20:10 (UTC)
Goto Top
Guten Morgen,

vielen Dank für die schnellen und hilfreichen Antworten...funktioniert prima.

zusätzlich zu den umbenannten Dateien erscheinen auch "bytes" und "bytes free" und werden entsprechend konvertiert.

Bevor ich nun das echo aus der Programmzeile nehme, möchte ich aus reiner Vorsicht (da dies nicht gewollt war), lieber eine zusätzliche Abfrage auf die Dateiendung machen
und nur bestimmte Dateiendungen innerhalb des Ordners umbenennen lassen.

Sorry, hätte ich auch früher drauf kommen können...denn das steigert die Flexibilität des Programms erheblich.

Schönes Wochenende...

MfG
Member: Skyemugen
Skyemugen May 15, 2011 at 07:51:52 (UTC)
Goto Top
Aloha,

na dann pack dir doch einfach ein *.typ zum dir dazu, sollte nicht die Schwierigkeit sein und für mehrere spezifische Dateiendungen dann eben *.typ *.typ *.typ etc.

dir /a-d /c *.typ *.typ^|findstr /v "Datei(en) Verzeichnis(se)"

greetz André
Member: Heppy225
Heppy225 May 15, 2011 at 08:15:28 (UTC)
Goto Top
Hallo André,

Dank für die Hilfe...die batch selektiert nur noch bestimmte Dateitypen, aber sie versucht immer noch "bytes" und "bytes free" umzubenennen.

Nun die Frage des Unwissenden: egal? oder kann ich verhindern, dass die Systeminfo umbenannt wird?

Bevor ich das nicht weiß, möchte ich das echo nicht entfernen.

Gruß
Member: Skyemugen
Skyemugen May 15, 2011 at 08:28:14 (UTC)
Goto Top
Aloha,

ach, das hatte ich überlesen, nun, ganz einfach:

Wie im Code bereits ersichtlich, ist findstr /v deine Lösung, also hängst du das ganz einfach noch einmal an: (einmal bytes reicht ja, ist ja in beiden enthalten)
dir /a-d /c *.typ *.typ^|findstr /i /v "Datei(en) Verzeichnis(se) bytes"
... wobei es mich verwundert: Denn mit findstr /v "Datei(en) Verzeichnis(se)" sollte das ausgeschlossen sein ... ach du hast eine englische Version kann das sein?
Wenn dem so ist, schau doch einfach, was bei dir statt dieser Kriterien in der Ausgabe
               2 Datei(en),      1.572.864 Bytes
               0 Verzeichnis(se), 40.405.688.320 Bytes frei
dann steht (dann sicherlich files und folders oder so) - dann benötigst du eines der beiden findstr /v nicht mehr, sondern lässt entweder das bytes (womit auch alle Dateien betroffen wären, die bytes im Namen haben) oder änderst das deutsche Datei(en) ins bei dir wohl vorhandene englisch file(s) [nehme ich an] und Verzeichnis(se) in folder(s) [schätze ich mal] um.

greetz André

P.S.:
Bevor ich das nicht weiß, möchte ich das echo nicht entfernen.
Eine sehr kluge Einstellung =) (wobei da nicht viel passieren würde, vllt. eine Fehlermeldung, dass die Datei nicht vorhanden ist face-wink)

edit: einmal Überfluss entfernt, siehe technischen Hinweis von bastla ^_^ aber dafür Schalter /i hinzugefügt, you never know (deutsche Version: Bytes - englische Version: bytes)
Member: bastla
bastla May 15, 2011 at 08:53:57 (UTC)
Goto Top
@Skyemugen
ach du hast eine englische Version kann das sein?
Das wäre auch meine Schlussfolgerung gewesen ... face-smile
Technische Anmerkung: Du hättest für "bytes" kein weiteres "findstr" benötigt (ohne "/c:" können - durch Leerzeichen getrennt - mehrere Suchbegriffe angegeben werden) ...

Grüße
bastla
Member: Skyemugen
Skyemugen May 15, 2011 at 09:11:57 (UTC)
Goto Top
Aloha bastla,

stimmt, naja heute ist Sonntag und Frühstück war zu der Zeit auch noch nicht *gg* - war mir zwar vorher schon aufgefallen aber aus Gewohnheit ...

greetz André
Member: bastla
bastla May 15, 2011 at 09:15:13 (UTC)
Goto Top
[OT] @Skyemugen
und Frühstück war zu der Zeit auch noch nicht *gg*
Ist ja wohl das Mindeste, was man/frau von einem Sonntag erwarten kann ... face-wink

Grüße
bastla
[/OT]
Member: Heppy225
Heppy225 May 15, 2011 at 20:41:27 (UTC)
Goto Top
Guten Abend,

mußte leider zur Arbeit und kann deshalb erst jetzt antworten.

Ja ich habe eine engl. Version und deine Änderung funktioniert prima. Danke.
Ich versuche zwar die nötigen Informationen selbst zu finden, aber als Laie suche ich oft nach den falschen Begriffen oder die Informationen
entsprechen nicht dem Kenntnisstand.

Ich möchte nun noch die Batch Datei so abändern, dass eventuelle Unterordner mitbearbeitet werden. Ich vermute mal, dass ich das durch Änderung des dir Befehls
erreiche; bin aber noch nicht erfolgreich fündig geworden.

Ich möchte mich nochmals für die schnelle und kompetente Unterstützung bedanken.

MfG
Member: bastla
bastla May 15, 2011 at 20:57:27 (UTC)
Goto Top
Hallo Heppy225!

Hinsichtlich der Berücksichtigung der Unterordner wird ein zusätzliches "/s" beim "dir"-Befehl nicht genügen - Du brauchst "außenrum" eine weitere Schleife - etwa:
for /f "delims=" %%i in ('dir /s /b /ad "%Ordner%"') do (  
    pushd "%%i"  
    for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c^|findstr /v "File(s) Dir(s)"') do echo ren "%%d" "%%~nd_%%c%%~xd"  
    popd
)
Grüße
bastla

[Edit] "Datei(en)" und "Verzeichnis(se)" durch engl. Version ersetzt [Edit]

[Edit2] Fehlendes "in" in Zeile 1 nachgetragen [/Edit]
Member: Heppy225
Heppy225 May 15, 2011 at 21:21:14 (UTC)
Goto Top
Hallo Bastla,

habe dein Konstrukt eingebaut und den dir Befehl wieder um den Parameter /i und bytes erweitert.

Leider popt der Screen nur kurz auf und ich kann das Ergebnis nicht kontrollieren.

Grüße
Heppy
Member: bastla
bastla May 15, 2011 at 21:27:05 (UTC)
Goto Top
Hallo Heppy225!

Abgesehen davon, dass ein Batch ohnehin (zum Testen) aus einem CMD-Fenster gestartet werden sollte, kannst Du weiterhin mit "pause" als letzter Zeile in Ruhe die Ausgabe kontrollieren ...

Was ich nicht deutlich gemacht hatte: Die neuen Zeilen sind als Ergänzung des bisherigen Batches unmittelbar vor der letzten Zeile (eben "pause") einzufügen (da ansonsten der Startordner selbst nicht bearbeitet würde).
[Edit] Eleganter (aber ungetestet face-wink) wäre in diesem Fall dann aber wohl:
@echo off & setlocal
set "Ordner=C:\_Backup\Test"  

for /r "%Ordner%" %%i in (.) do (  
    pushd "%%i"  
    for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c^|findstr /v "File(s) Dir(s)"') do echo ren "%%d" "%%~nd_%%c%%~xd"  
    popd
)
pause
[/Edit]

Grüße
bastla
Member: Heppy225
Heppy225 May 15, 2011 at 21:48:16 (UTC)
Goto Top
Hallo Bastla,

hier nochmal das bisherige Ergebnis:

@echo off & setlocal
set "Ordner=C:\_Backup\Test"
pushd "%Ordner%"

for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c *.txt^|findstr /i /v "Datei(en) Verzeichnis(se) bytes"') do (
echo ren "%%d" "%%~nd_%%c%%~xd"
)

for /f "delims=" %%i ('dir /s /b /ad "%Ordner%"') do (
pushd "%%i"
for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c *.txt^|findstr /i /v "Datei(en) Verzeichnis(se) bytes"') do echo ren "%%d" "%%~nd_%%c%%~xd"
popd
)
echo.
pause


leider popt der Screen nur. Ich muß wohl einen Fehler eingebaut haben. Danke für deine Geduld und Nachsicht mit einem Anfänger und der hilfreichen Erklärung.

Gruß
Heppy225
Member: bastla
bastla May 15, 2011 at 22:00:16 (UTC)
Goto Top
Hallo Heppy!
Ich muß wohl einen Fehler eingebaut haben.
Nö - das "in" nach dem "%%i" hab' schon ich vergessen face-sad - ich korrigier's gleich auch oben, obwohl ohnehin die letzte gepostete Version besser sein sollte) ...

Grüße
bastla

P.S.: Bitte verwende zum Posten von Codeschnippseln die passende ...
Member: Heppy225
Heppy225 May 21, 2011 at 18:33:21 (UTC)
Goto Top
Guten Abend,

leider hatte ich bisher keine Zeit gefunden (Arbeit) die letzte Version zu testen. Sie funktioniert prima. Leider funktioniert sie für meine Bedürfnisse zu gut.
Dies ist aber mein Fehler, da meine Beschreibung meines Vorhabens nicht ordentlich war.

Die letzte Version macht genau das was sie soll, nämlich alle *.7z Dateien umbenennen. In meinem zu bearbeitenden Ordner sind weitere Ordner, die ich packe
(leider sind in diesen Ordner auch *.7z Dateien enthalten, die jetzt mit umbenannt werden).
Ich möchte also nur das Ergebnis (die *.7z files/Dateien) umbenennen.

MfG
Member: bastla
bastla May 21, 2011 at 18:37:27 (UTC)
Goto Top
Hallo Heppy225!

Bitte poste doch nochmal die Batch-Version, welche Du jetzt verwendest ...

Grüße
bastla
Member: Heppy225
Heppy225 May 21, 2011 at 18:55:35 (UTC)
Goto Top
Guten Abend bastla,

hier der Code (leider nicht formatiert):

@echo off & setlocal
set "Ordner=C:\_Backup\Test2"

for /r "%Ordner%" %%i in (.) do (
pushd "%%i"
for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c *.7z^|findstr /i/v "File(s) Dir(s) bytes"') do (
echo ren "%%d" "%%~nd_%%c%%~xd"
popd
)
)
echo files renamed ...
pause

MfG
Member: bastla
bastla May 21, 2011 at 19:03:14 (UTC)
Goto Top
Hallo Heppy225!

Nur die unmittelbaren Unterordner von "C:\_Backup\Test2" zu behandeln sollte so gehen:
@echo off & setlocal
set "Ordner=C:\_Backup\Test2"  

for /d %%i in ("%Ordner%\*.*") do (  
    pushd "%%i"  
    for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c *.7z^|findstr /i/v "File(s) Dir(s) bytes"') do (  
        echo ren "%%d" "%%~nd_%%c%%~xd"  
    )
    popd
)
echo files renamed ...
pause
Grüße
bastla

P.S.: Die Formatierung (Link siehe oben) bekommst Du sicher auch noch hin ... face-wink
Member: Heppy225
Heppy225 May 21, 2011 at 20:06:43 (UTC)
Goto Top
Hallo bastla,

entschuldige das ich mich jetzt erst melde, mir ist ein wichtiges Telefonat dazwischen gekommen.

Funktioniert prima...herzlichen Dank für die schnelle Hilfe.

letzte Frage: ich bekomme zweimal die Meldung "FINDSTR: // ignored" und möchte wissen, was es bedeutet?

MfG
Member: bastla
bastla May 21, 2011 at 20:12:54 (UTC)
Goto Top
Hallo Heppy225!

Erhältst Du die Meldung auch noch, wenn Du das Leerzeichen zwischen "/i" und "/v" wieder einfügst (ich hatte das oben von Dir so koipiert)? BTW: Nach "bytes" solltest Du nicht suchen müssen (oder Du sparst alternativ "Dir(s)" und "File(s)" ein und hast eine Version, die auch mit einem deutschen Windows funktioniert - solange in keinem Dateinamen "bytes" vorkommt) ...

Grüße
bastla
Member: Heppy225
Heppy225 May 21, 2011 at 20:23:03 (UTC)
Goto Top
Hallo bastla,

die Meldung ist verschwunden, dafür bekomme ich jetzt die Meldungen File not found.

Gruß
Heppy
Member: bastla
bastla May 21, 2011 at 20:30:00 (UTC)
Goto Top
Hallo Heppy225!

Die entsprechende Zeile sollte jetzt so
for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c *.7z^|findstr /i /v "File(s) Dir(s)"') do (
oder so
for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c *.7z^|findstr /i /v "bytes"') do (
aussehen - soferne es Unterordner gibt, die keine *.7z-Datei enthalten, wäre die Meldung erklärlich und sollte sich durch
for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c *.7z 2^>nul^|findstr /i /v "File(s) Dir(s)"') do (
bzw
for /f "skip=5 tokens=1-3*" %%a in ('dir /a-d /c *.7z 2^>nul^|findstr /i /v "bytes"') do (
eliminieren lassen - ansonsten wieder mit "echo on" testen und feststellen, durch welche Zeile die Meldung verursacht wird ...

Grüße
bastla
Member: Heppy225
Heppy225 May 21, 2011 at 20:31:47 (UTC)
Goto Top
Hallo bastla,

bevor du dir Gedanken machst....war wieder mein Fehler.

Habe es diesmal nur mit einem Ordner versucht ohne Unterordner...dann kamen die Fehlermeldung.

Funktioniert einwandfrei.

Ich möchte mich nochmals für die unermüdliche Hilfestellung bedanken. Danke bastla!!!

Mein Problem ist gelöst.

ich wünsche eine Gute Nacht.

MfG Heppy