Batch - Mysteriöses FOR

Hi,

also ich wollte per Batch Dateien so umbenennen, dass vorne dran noch etwas steht, also z.B. aus BLA1234.txt soll beispielBLA1234.txt werden.

Eigentlich habe ich dass auch schon geschrieben, nur funktionierts nicht.

rem Also der String der angehängt werden soll
set string=Amelie -

rem die blöde for-Schleife die für jedes einzelne mp3 die
rem rename-unterfunktion („tren“) aufruft
for %%i in (*.mp3) do (
set name=%%i
call:tren
)

rem sind alle Elemente umbenannt soll die Batch beendet werden
goto:eof

rem Zielname basteln; Ausgabe in Log; die Umbenennung an sich
:tren
set name2=%string%%name%
echo „%name%“ „%name2%“ >> log.txt
ren „%name%“ „%name2%“

rem Rücksprung in die for Schleife
goto:eof

erzeugt komischerweise die Ausgabe:

"01 - J'y suis jamais all‚.mp3" "Amelie - 01 - J'y suis jamais all‚.mp3" 
[...]
"20 - La valse des monstres.mp3" "Amelie - 20 - La valse des monstres.mp3" 
"Amelie - 01 - J'y suis jamais all‚.mp3" "Amelie - Amelie - 01 - J'y suis jamais all‚.mp3" (SIC !)

Also die erste Datei wird zweimal umbenannt. Warum?!?!

mfg
Matze

hi matze

probier mal folgendes programm zum umbenennen:

http://toolsandmore.de/Central/Produkte/Software/Dat…

ich weiss, du wolltest eher eine antwort auf deine frage. aber den fehler zu suchen ist mühsam und das obige programm ist wirklich praktisch.

lg
erwin

Batch - Mysteriöser GOTO
Moin, matze,

lass den goto:eof weg, dann geht alles wie von selbst. help call erklärt, was der goto vermurkst. Sieht aus, als hättest Du etwas gestrickt, das entfernt an eine rekursive Prozedur erinnert.

Gruß Ralf

Hi Drambeldier,

ja? gib du mal help goto ein :wink: okay ich habe auch nicht erwähnt, dass es Windows XP (SP2 falls das was ausmacht).

Also wie das funktioniert ist n bisschen blöd zu erklären:
Im Endeffekt führt der Aufruf von der Unterfunktion, dazu, dass

-nochmal die komplette Batch aufgerufen wird
-aber direkt an das Label der „Unterfunktion“ gesprungen wird

-> Deswegen, dass die Unterfunktion wirklich unabhängig wird muss man zu :eof springen, ein Label standardmäßig vorgesehen bei win XP für jede Batch.

Was ganz nett ist, du kannst so einer Prozedur auch Variablen übergeben (%1 %2… wie bei normaler Batch)

Habe mir da auch einen „length“-Befehl gebastelt, der die Länge einer Variablen zurückgibt.

rem länge eines variable zurückgeben


> length

set name=%1
set wstr=!%name%!
set /a %name%l=0
 :sub
 if "!wstr!"=="" goto endsub
 set wstr=!wstr:~0,-1!
 set /a %name%l=!%name%l!+1
 goto sub
 :endsub
goto:eof

Leider gibts keine Funktionen, aber ich habs so gelöst:
nach dem Aufruf von length x wird die Länge des Strings x in der Variablen xl gespeichert.

Mfg
Matze

Hi Matze,

ja? gib du mal help goto ein :wink:

Verzeihung, ich dachte, Du wolltest etwas wissen.

okay ich habe auch nicht
erwähnt, dass es Windows XP (SP2 falls das was ausmacht).

Das hat beides keinen EInfluss auf die Ausführung von Batchdateien.

Also wie das funktioniert ist n bisschen blöd zu erklären:

Danke, ich hatte keine Frage gestellt.

Gruß Ralf

(ot) Batch - Mysteriöser GOTO
Hi,

ja? gib du mal help goto ein :wink:

Verzeihung, ich dachte, Du wolltest etwas wissen.

Also irgendwie finde ich diese Reaktion etwas seltsam, ich hab gedacht dich könnte es interessieren, da du mit deinem Titel für mich eine indirekte Frage gestellt hast.

Okok du bist Diplom-Informatiker, sorry dass ich deine Vika nicht gelesen habe, aber etwas netter hättest trotzdem reagieren können. (Du hasts wahrscheinlich nicht mal durchgelesen.)

Bevor ich jetzt noch erkläre, dass ein Strichpunkt gefolgt von einem Bindestrich und einer schliessenden Klammer ein Hinweis darauf sein könnte, dass man den vorhergehendem Text nicht allzuernst nehmen sollte, verbleibe ich mit freundlichen Grüßen

Matze

Info
[…]
Der GOTO-Befehl untersttzt jetzt die Marke :EOF. Dadurch wird die Bearbeitung
am Ende der aktuellen Batchdatei fortgesetzt. Das ist eine einfache
M”glichkeit, eine Batchdatei zu beenden, ohne ein Sprungziel zu definieren.
Geben Sie CALL /? ein, um weitere Informationen ber die Erweiterungen des
CALL-Befehls zu erhalten.

also ich wollte per Batch Dateien so umbenennen, dass vorne
dran noch etwas steht, also z.B. aus BLA1234.txt soll
beispielBLA1234.txt werden.

Hi Matze,

for %%a in (*.mp3) do rename %%a beispiel%%a

Gruß
Reinhard

Hi Reinhard,

for %%a in (*.mp3) do rename %%a beispiel%%a

vielen Dank, aber komischerweise funktioniert das auch nicht. Ich glaube das liegt daran, dass wenn viele Elemente umbenannt werden die Liste (*.mp3) aktualisiert wird.

Ich habs jetzt so gemacht, dass ich den Ursprungsnamen und den Zielnamen jeweils in einem „Feld“ gespeichert habe, und dann in einer extra Schleife durchlaufe und dann umbenenne.

Trotzdem Danke!
mfg
Matze

Hi Erwin,

ich weiss, du wolltest eher eine antwort auf deine frage. aber
den fehler zu suchen ist mühsam und das obige programm ist
wirklich praktisch.

Ja hast Recht…! :wink: aber das Programm kenn ich und ist auch sehr gut, aber ich will ja grade sowas selber schreiben (hat meinen Ehrgeiz geweckt…)

mfg
Matze

ERLEDIGT
Wer will kann ja mal testen…
(„entschärfte“ Version, lediglich Ausgabe am Bildschirm und in Log-Datei wird erstellt)

REM \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_INITIALISIERUNG\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
title RENAMER
@echo off
echo.\>log.txt
setlocal enabledelayedexpansion
set /a c=0
set /a zeros=0



REM\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_M E N Ü\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
 :menu
cls
echo R E N A M E R
echo.
echo 1. String vorne einfuegen
echo 2. Nummer vorne einfuegen
echo.
set /p auswahl=Deine Auswahl:
if not %auswahl%==1 if not %auswahl%==2 if not %auswahl%==3 goto menu
 

cls
echo Der Aufbau des Dateinamens sieht dann so aus: 
goto %Auswahl%

 :1
echo [String] + [Dateiname]
echo.
echo.
echo.
call:get Kriterium
call:get Vorne
goto start



 :2
echo [String] + [Nummer] + [String] + [Dateiname]
echo.
echo.
echo.
call:get Kriterium
call:get Vorne optional
call:get Nummer
call:get Schritt
call:get Zeros
call:get Hinten optional
set /a schritt=%schritt%
set /a nummer=%nummer%
set /a zeros=%zeros%
goto start


 :3
goto start




\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_METHODENBEREICH FUNKTIONEN\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
 :get
set aktuell=%1
if %1==Kriterium set Ausgabe=Bitte geben sie ein Datei-Auswahlkriterium ein (zb \* oder \*.mp3):
if %1==Vorne set Ausgabe=Bitte geben sie vorne anzuhaengenden String an:
if %1==Nummer set Ausgabe=Bitte geben sie eine anzuhaengende Nummer an:
if %1==Schritt set Ausgabe=In was fuer Schritten soll gezaehlt werden?:
if %1==Zeros set Ausgabe=Auf wieviel Stellen soll mit Nullen aufgefüllt werden?(-1 = Autodetect):
if %1==Hinten set Ausgabe=Bitte geben sie einen anzuhaengenden String an:
set /p %aktuell%=%Ausgabe%
if not "%2"=="optional" if "!%aktuell%!"=="" call:get %1
echo.
goto:eof



rem leading zeros erstellen
 :lzero
set znum=%nummer%
set /a g=0
 :genznum
 call:length znum
 set /a znuml=%znuml%
 if %zeros% leq %znuml% goto endgenzn
 set znum=0%znum%
 set /a g=!g!+1
 goto genznum
 :endgenzn
goto:eof

\_ \_ \_ \_ \_ \_ \_ \_ \_ \_ \_ \_ \_ \_ \_ 

rem länge eines strings zurückgeben
 :length
set name=%1
set wstr=!%name%!
set /a %name%l=0
 :sub
 if "!wstr!"=="" goto endsub
 set wstr=!wstr:~0,-1!
 set /a %name%l=!%name%l!+1
 goto sub
 :endsub
goto:eof


\_ \_ \_ \_ \_ \_\_ \_ \_ \_ \_ \_ \_ \_ \_ \_

rem benötigte zeros berechnen
 :zeroneeded
set /a lastindex=%schritt%\*%max%
set /a lastindex=%lastindex%+%nummer%
set lastindex=%lastindex%
call:length lastindex
set /a zeros=%lastindexl%
echo Anzal der führenden Nullen %Zeros%
goto:eof


\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_M A I N\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
 :start

rem \_\_\_Dateinamen einzeln abspeichern
for %%i in (%kriterium%) do (
set nameA!c!=%%i
set /a c=!c!+1
)


rem \_\_\_Anzahl der Dateien (benötigt zum leading zero berechnen)
set /a max=%c%
if %zeros%==-1 call:zeroneeded

set /a c=0


rem \_\_\_Umbennungsschleife
 :schleife
 if not zeros==0 call:lzero

 set nameB!c!=%vorne%%znum%%hinten%!nameA%c%!

 echo %c% "!nameA%c%!" "!nameB%c%!" \>\> log.txt
 echo %c% "!nameA%c%!" "!nameB%c%!"
 rem ren "!nameA%c%!" "!nameB%c%!"
 
 if not "%nummer%"=="" set /a nummer=!nummer!+%schritt%

 set /a c=!c!+1
 if %max% leq %c% goto:end
goto schleife


 :end
pause

for %%a in (*.mp3) do rename %%a beispiel%%a

vielen Dank, aber komischerweise funktioniert das auch nicht.
Ich glaube das liegt daran, dass wenn viele Elemente umbenannt
werden die Liste (*.mp3) aktualisiert wird.
Ich habs jetzt so gemacht, dass ich den Ursprungsnamen und den
Zielnamen jeweils in einem „Feld“ gespeichert habe, und dann
in einer extra Schleife durchlaufe und dann umbenenne.

Hi Matze,
es funktionierte bei WinXP mit 39 Dateien, wieviele hast du denn?
Gruß
Reinhard

Hi Reinhard,

es funktionierte bei WinXP mit 39 Dateien, wieviele hast du
denn?

Eigentlich nur 20, aber es will so partout nicht funktionieren :frowning:

Naja mit dem Feld funktionierts jedenfalls ganz gut… seltsam…
Aber nochmals Danke,
mfg
Matze

Hi,

habs nochmal getestet wie du gemeint hast mit so ca 100 Dateien und das Ergebnis war:

beispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispiel% t #+ ä (10).txt
[…]

Vielleicht hast du ne schnellere Festplatte?!?
mfg
Matze

habs nochmal getestet wie du gemeint hast mit so ca 100
Dateien und das Ergebnis war:

beispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispielbeispiel%
t #+ ä (10).txt
[…]

Vielleicht hast du ne schnellere Festplatte?!?

Hi Matze.
k.A. welche Werte di hat, die CPU hat 1,7 GHz.

Probier mal das:

echo echo=on > tt.bat
for %%a in (*.mp3) do echo rename %%a beispiel%%a >>tt.bat
tt.bat

kann doch nicht sein dass man dieses kleine Dosproblem nicht hingebogen bekommt :smile:
Gruß
Reinhard

1 Like

[ot] Umziehen ins Plauderbrett?
Moin, Matze,

ich habe keine Frage gestellt, noch nicht mal indirekt, sondern Dir einen Tipp gegeben. Nach meiner Methode (ohne diesen kruden Goto) funktioniert das Ganze jedenfalls.

Wenn ich Fragen beantworte, so interessieren mich Alternativen nur dann, wenn meine Lösung nicht klappt. Zum Plaudern über mögliche unterschiedliche Welten habe ich einfach nicht die Zeit.

Gruß Ralf