paximperia
Goto Top

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
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]

Content-Key: 88092

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

Printed on: April 25, 2024 at 22:04 o'clock

Member: BigWumpus
BigWumpus May 20, 2008 at 14:22:59 (UTC)
Goto Top
PocketD von Pocketware war so ein DOS-Tool, das alles konnte.
Leider hat es wohl Probleme mit langen Dateinamen.

In 4DOS konnte man sowas auch leicht programmieren, weil es sehr starke Befehle dafür gab.
Member: Biber
Biber May 20, 2008 at 15:23:49 (UTC)
Goto Top
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:
  • 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
Member: bastla
bastla May 20, 2008 at 15:32:07 (UTC)
Goto Top
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):
@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
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
Member: Paximperia
Paximperia May 21, 2008 at 06:07:15 (UTC)
Goto Top
Guten morgen

Vielen dank für Eure Antworten

Ich habe die Variante von bastla genommen und die Zählung angepasst.Damit habe ich eine gute Lösung.
Ich werde aber die Variante von Biber auch noch probieren (zum üben)

@ BigWumpus
Ich verwende lieber eine eigen Batch als irgendein Prog,aber trotzdem danke.

Mfg

Stephan