Umbenennen von TXT dateien mit größe x oder größer per Batch
Ich möchte bestimmte TXT Dateien nach Dateigröße filtern und nur die,welche der göße x oder größer x sind umbenennen.
Meine Testshell sieht wie folgt aus.Nur mache ich irgendwie einen Denkfehler da bei mir immer alle txt Dateien (also auch die welche kleiner x sind ) umbenannt werden.
Würde mich über denkhilfe freuen
Mfg
Stephan
[Edit Biber] Code in -Tags gesetzt [/Edit]
Meine Testshell sieht wie folgt aus.Nur mache ich irgendwie einen Denkfehler da bei mir immer alle txt Dateien (also auch die welche kleiner x sind ) umbenannt werden.
Würde mich über denkhilfe freuen
rem pipe Datum Uhrzeit
date /t >> c:\umbenennen\copy.log
time /t >> c:\umbenennen\copy.log
rem abfrage Dateigröße
for %%F in (C:\umbenennen\*log*.txt) do set groesse=%%~zF
echo prüfen >> c:\umbenennen\copy.log
if %groesse% geq 1024 goto start
echo sprung start >> c:\umbenennen\copy.log
if %groesse% lss 1024 goto nde
echo sprung ende >> c:\umbenennen\copy.log
rem ENDE
:nde
echo keine Datei mit grösse x vorhanden >> c:\umbenennen\copy.log
exit
rem zähler setzen !!
:start
echo dateien umbenannt >> c:\umbenennen\copy.log
SET Zaehler=0
SET Pfad=c:\umbenennen\*log.old*
rem umbenennung der dateein *.log.old*
:umbenennen
rem cd %Pfad%\umbenennen
ren *log*.txt *log*.old%Zaehler%
goto Ums
:ende
rem zähler einen hochsätzen falls *log.oldx schon vorhanden
:ums
set /a Zaehler+=1 >> c:\umbenennen\copy.log
ren *log*.txt *log*.old*%Zaehler%
IF EXIST %Pfad%%Zaehler% goto ums
echo erfolgreich >> c:\umbenennen\copy.log
:ende
Mfg
Stephan
[Edit Biber] Code in -Tags gesetzt [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 88092
Url: https://administrator.de/contentid/88092
Ausgedruckt am: 26.11.2024 um 14:11 Uhr
4 Kommentare
Neuester Kommentar
Moin Paxi,
im Moment läufst du zwar mit der FOR-Anweisung über alle Dateien mit einer Schleife und prüfst/SETzt je Datei die %groesse%....
Aber alles andere ist NACH der (gedanklichen) FOR-Schleife und findet gemäß diesen Regeln statt:
Außerdem solltest Du eher mit "Call :subblock" statt mit "goto subblock" arbeiten, da Du dann paramter 8z.B. den dateinamen übergeben kannst.
Ändere die FOR-Anweisung so ab:
Grüße
Biber
im Moment läufst du zwar mit der FOR-Anweisung über alle Dateien mit einer Schleife und prüfst/SETzt je Datei die %groesse%....
Aber alles andere ist NACH der (gedanklichen) FOR-Schleife und findet gemäß diesen Regeln statt:
- Wenn zufällig bei der letzten Datei in der Liste herauskommt "größer gleich x", dann werden halt danach alle Dateien umbenannt.
- Wenn zufällig bei der letzten Datei in der Liste herauskommt " kleiner x", dann wird danach keine einzige Datei umbenannt.
Außerdem solltest Du eher mit "Call :subblock" statt mit "goto subblock" arbeiten, da Du dann paramter 8z.B. den dateinamen übergeben kannst.
Ändere die FOR-Anweisung so ab:
...
for %%F in (C:\umbenennen\*log*.txt) do If %%~zF geq 1024 call :RenameFile "%%F"
goto :eof
...
:RenameFile parameter1 ist der Dateiname
... [Zählermimik.... umbenamsen....]
...
:: back to caller mit goto :eof
goto :eof
Grüße
Biber
Hallo Paximperia und willkommen im Forum!
Dein Denkfehler bezieht sich zunächst auf die Funktionsweise der "for"-Schleife - Du überprüfst eigentlich nur die letzte Datei der gesamten Liste, da alle folgenden Befehle erst ausgeführt werden, wenn alle Dateien in der "for"-Schleife "durch" sind. Die Lösung ist das Verzweigen in ein Unterprogramm (siehe unten).
Weiters werden durch die Angabe von "*log*.txt" immer alle Textdateien mit dem Namensbestandteil "log" erfasst - um nur einzelnen Dateien einen neuen Namen zu geben, musst Du diese gezielt ansprechen; im Beispiel unten kommt jede Datei aus der Schleife als %1 im Unterprogramm an.
Leichter les- und vor allem wartbar wird ein Batch durch die Verwendung von Variablen - diese kannst Du übersichtlich am Anfang mit Werten füllen.
Unter Berücksichtigung dieser Überlegungen könnte Dein Batch etwa so aussehen (wobei natürlich Bibers Schreibweise oben kompakter ist):
Die Zählung der umbenannten Dateien stimmt nur beim ersten Mal (wenn sich noch keine umbenannten Dateien im Ordner befinden), ansonsten müsstest Du eine zusätzliche Zählvariable verwenden. Die Schreibweise mit ".old#" würde ich zwar anders gestalten, aber wenn's für Dich passt ...
Grüße
bastla
Dein Denkfehler bezieht sich zunächst auf die Funktionsweise der "for"-Schleife - Du überprüfst eigentlich nur die letzte Datei der gesamten Liste, da alle folgenden Befehle erst ausgeführt werden, wenn alle Dateien in der "for"-Schleife "durch" sind. Die Lösung ist das Verzweigen in ein Unterprogramm (siehe unten).
Weiters werden durch die Angabe von "*log*.txt" immer alle Textdateien mit dem Namensbestandteil "log" erfasst - um nur einzelnen Dateien einen neuen Namen zu geben, musst Du diese gezielt ansprechen; im Beispiel unten kommt jede Datei aus der Schleife als %1 im Unterprogramm an.
Leichter les- und vor allem wartbar wird ein Batch durch die Verwendung von Variablen - diese kannst Du übersichtlich am Anfang mit Werten füllen.
Unter Berücksichtigung dieser Überlegungen könnte Dein Batch etwa so aussehen (wobei natürlich Bibers Schreibweise oben kompakter ist):
@echo off & setlocal
set "log=c:\umbenennen\copy.log"
set "Pfad=c:\umbenennen\*log*.txt"
set "old=.old"
set "gr=1024"
if exist "%log%" del "%log%"
rem pipe Datum Uhrzeit
date /t >>"%log%"
time /t >>"%log%"
rem Zähler setzen !!
set Zaehler=0
rem Alle Dateien einzeln durchgehen
for %%F in (%Pfad%) do call :Verarbeiten "%%F"
if %Zaehler% gtr 0 (
echo %Zaehler% dateien umbenannt >> "%log%"
) else (
echo keine Datei mit mindestens %gr% Bytes vorhanden >> "%log%"
)
goto :eof
:Verarbeiten
rem Die Datei kommt als %1 an
set groesse=%~z1
echo prüfen >> "%log%"
if %groesse% lss %gr% echo %1 zu klein - sprung ende >> "%log%" & goto :eof
:Hochzaehlen
set /a Zaehler+=1
if exist "%~1%old%%Zaehler%" goto :Hochzaehlen
echo Naechste Nummer: %Zaehler% >> "%log%"
:Umbenennen
ren %1 "%~nx1%old%%Zaehler%"
echo erfolgreich: %1 -^> "%~nx1%old%%Zaehler%" >> "%log%"
goto :eof
Grüße
bastla