Schleife zum Umbenennen

Batchelor

Newbie
Registriert
Juni 2023
Beiträge
5
Hallo liebe User,
Ich habe ein ganz präzieses Problem. Ich suche eine Batchdatei die folgendes Problem löst.
Sie soll einmal täglich vom Taskplaner des Windows Betriebssystem aufgerufen werden und dann in einem
Verzeichnis Dateien umbenennen. Die Dateien haben die Namen 001.wav , 002.wav . . . bis 150.wav.
Die Umbenennung soll so erfolgen, dass die zweite Datei zur ersten wird , die dritte zur zweiten usw.
Die ursprünglich erste Datei 001.wav soll am Schluss wieder zu 150.wav werden. Ich glaub das nennt man zykliche Vertauschung.
Mein Softwaretimer hat dann immer eine neue Reihenfolge der Sounds, so dass ich mich nicht daran gewöhne.
Ich hatte schon mal so ein Programm selbst geschrieben und es schlichtweg verschlampt. Jetzt bin ich nicht mehr so flexibel
um es selbst auf die Reihe zu bringen. Die Batchdatei soll am Schluss im Soundordner liegen und dort vom Taskplaner aufgerufen werden.
Vielleicht ist jemand so nett und hilft mir. MfG Batchelor
 
rename 001.wav temp.wav
rename 002.wav 001.wav
rename 003.wav 002.wav
[...]
rename 150.wav 149.wav
rename temp.wav 150.wav
exit

dafür braucht man keine schleife nur 150x copy/paste
 
Hallo Sunweb,
Danke, an diese einfachste Lösung habe ich auch schon gedacht. Aber als Ästhet würde ich mir schon so ne Scheifenlösung wünschen. Mfg Batchelor
 
Das müsste doch mit PowerRename von PowerToys und/oder mit den Regular Expressions möglich sein.

\d
\d+

Zahl lesen, mit 1 addieren, auf umbenennen klicken

Quasi so ähnlich:
Python:
content = file.read()
match = re.search(r"\d+", content)

if match:
    number = int(match.group())
    number += 1

Müsste man nur in Batch umwandeln, wovon ich keine Ahnung habe.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Nebuk
Batchelor schrieb:
Aber als Ästhet würde ich mir schon so ne Scheifenlösung wünschen.
Hast du als Aesthet denn auch mal nachgesehen wie man eine Schleife in Batch umsetzt? Ich kann mir kaum vorstellen, dass du dazu kein Tutorial findest, das ist so elementar
z.B. sowas? https://ss64.com/nt/for_l.html

Du willst eine Schleife (for ...) von 1-5 und du willst umbenennen (rename ...), woran genau scheiterst du denn bei deinen Versuchen?
 
  • Gefällt mir
Reaktionen: nkler
Batch ist eine Ausgeburt der Hölle. Nimm einfach Ruby oder Python.
 
  • Gefällt mir
Reaktionen: ###Zaunpfahl###
@echo off
setlocal enabledelayedexpansion

set "sourceDir=C:\Pfad\zum\Verzeichnis"

for /L %%i in (150,-1,2) do (
set /a j=%%i-1
set "sourceFile=00!j!.wav"
set "targetFile=00!i!.wav"
ren "%sourceDir%\!sourceFile!" "!targetFile!"
)

set "sourceFile=0150.wav"
set "targetFile=001.wav"
ren "%sourceDir%\!sourceFile!" "!targetFile!"

endlocal
 
Hallo LasseSamenström,
So ähnlich habe ich mir das vorgestellt. Da ist noch ein kleiner Fehler drin set "sourceFile=0150.wav"
muss set "sourceFile=150.wav" sein. Außerdem muss, so glaube ich, eine der letzten oder ersten wav-Dateien
temporär umbenannt werden, damit es nicht zum Überschreiben einer bereits vorhandenen Datei kommt.
Vielleicht fällt Dir dazu noch was ein. Danke erstmals für diesen Einstieg. Ich hab es allerdings nicht fehlerfrei zum Laufen gekriegt. MfG Batchelor
 
Zuletzt bearbeitet:
Dann so:


Diff:
@echo off
setlocal enabledelayedexpansion

set "sourceDir=C:\Pfad\zum\Verzeichnis"
set "tempFile=temp.wav"

rem Umbenennen der letzten Datei zu einer temporären Datei
ren "%sourceDir%\150.wav" "!tempFile!"

for /L %%i in (149,-1,1) do (
    set /a j=%%i+1
    set "sourceFile=00!i!.wav"
    set "targetFile=00!j!.wav"
    ren "%sourceDir%\!sourceFile!" "!targetFile!"
)

rem Umbenennen der temporären Datei zur ersten Datei
ren "%sourceDir%\!tempFile!" "001.wav"

endlocal
 
Hallo LasseSamenström,
Vielen Dank dass du am Thema dran geblieben bist. Ich habe Deine Datei getestet.
Dazu habe ich mir ein Testverzeichnis angelegt.
D:\Tools_Neues\Uhren\FreeAlarmClockPortable\Uebung_1
Darin habe ich zehn kleine Sounddateien "001.WAV", "002.WAV", . . . . "010.WAV"
abgelegt.
Dann habe ich deine Vorlage zahlenmäßig angepasst und zur Kontrolle zwei Pausen eingesetzt: Dateiname: umnummerieren.bat

@Echo off
setlocal enabledelayedexpansion
set "sourceDir=D:\Tools_Neues\Uhren\FreeAlarmClockPortable\Uebung_1"
set "tempFile=temp.WAV"

rem Umbenennen der letzten Datei zu einer temporären Datei
ren "%sourceDir%\010.WAV" "!tempFile!"
pause
for /L %%i in (9,-1,1) do (
set /a j=%%i+1
set "sourceFile=00!i!.WAV"
set "targetFile=00!j!.WAV"
ren "%sourceDir%\!sourceFile!" "!targetFile!"
pause
)
rem Umbenennen der temporären Datei zur ersten Datei
ren "%sourceDir%\!tempFile!" "001.WAV"
endlocal


Ich hoffe dass ich das fehlerfrei transformiert habe.
Ich habe dann das Programm getestet und bis zur ersten Pause keine Fehlermeldung erhalten. Das Resultat kannst du in Bild 2 sehn.
Als ich mit Tastendruck weiter machen wollte, kam wiederholt folgende Fehlermeldung.
"Das System kann die angegebene Datei nicht finden."
Der Fehler könnte in den Zuweisungen der Dateinamen liegen. Ich blick das leider nicht so mit dem einfachen und doppelten Prozentzeichen. Außerdem kenn ich keine Methode zum Auffüllen von Nullen (padding ?). Vielleicht kannst du mir nochmal etwas weiterhelfen, ich habs gestern öfters versucht ohne Erfolg.
Liebe Grüße Batchelor
 

Anhänge

  • Bild 1 Ausgangssituation.jpg
    Bild 1 Ausgangssituation.jpg
    85,7 KB · Aufrufe: 66
  • Bild 2 bei erster Pause.jpg
    Bild 2 bei erster Pause.jpg
    72,2 KB · Aufrufe: 67
  • Bild 3 nach erster Pause.jpg
    Bild 3 nach erster Pause.jpg
    85,7 KB · Aufrufe: 65
Bau erst mal ein echo in die Schleife ein: echo "%sourceDir%\!sourceFile!" "!targetFile!" und rem das renamen aus.
Damit siehst Du, wo dein Problem liegt: set "sourceFile=00!i!.WAV" müsste set "sourceFile=00%%i.WAV" sein oder aber erst mal set "i=%%i".
Das zweite Problem sind die Führende 0en. So wie es aktuell gemacht wird, kann es nur bei 0-9 klappen. Bei 100 erhälst du eine Dateinamen "00100.wav", den er nicht findet. Du musst alle Strings auf 7 Zeichen begrenzen, z.B:
echo "%sourceDir%\!sourceFile:~-7!" "!targetFile:~-7!"
 
Hallo liebe Helfer,
Es hat endlich geklappt, ich danke euch.
Damit andere User auch was davon haben, hier das Endprodukt:

@Echo off
setlocal enabledelayedexpansion
REM Den folgenden Pfad anpassen
set "sourceDir=D:\Tools_Neues\Uhren\FreeAlarmClockPortable\Wecker_Timer_sounds"
set "tempFile=temp.mp3"
rem Umbenennen der letzten Datei zu einer temporären Datei
ren "%sourceDir%\243.mp3" "!tempFile!"
REM pause
for /L %%i in (242,-1,1) do (
set /a j=%%i+1
set "sourceFile=00%%i.mp3"
set "targetFile=00!j!.mp3"
REM echo "%sourceDir%\!sourceFile!" "!targetFile!"
REM echo "%sourceDir%\!sourceFile:~-7!" "!targetFile:~-7!"
REM padding auf 3 + 4 Zeichen mit Extension
set "sourceFile=!sourceFile:~-7!
set "targetFile=!targetFile:~-7!
ren "%sourceDir%\!sourceFile!" "!targetFile!"

REM pause
)
REM Umbenennen der temporären Datei zur ersten Datei
ren "%sourceDir%\!tempFile!" "001.mp3"
endlocal


Die REM Zeilen dienten teilweise der Kontrolle und können komplett entfernt werden.
Speziellen Dank nochmal an LasseSamenström und kleiner_Muk.

Nochmals liebe Grüße Batchelor

 
Zurück
Oben