# [Batch] Counter funktioniert nicht



## jkloea (3. August 2008)

Hallo liebe Gemeinde,

ich habe mich hier neu angemeldet und hoffe, dass ihr mir bei meinem Problem behilflich sein könnt. 

Und zwar hab ich folgende Batch, die mir in ganz vielen Ordnern den enthaltenen Jpeg-Dateien den Ordnernamen übergibt und danach eine Zahl beginnend mit eins:


```
@echo on
rem =====jeden ordner einzeln aufrufen=======
for /d %%n in (*.*) do (
   set /a counter=1
   set ordner=%%n
   if exist "%%n\*.jpeg" call:jpegblubb
)
rem =========================================

pause
set counter=
set ordner=
exit

:jpegblubb
echo 1) counter=%counter%

rem =====jede Datei im Ordner %%n aufrufen======
for %%i in ("%ordner%\*.avi") do (

   echo 2) counter=%counter%

   rem =====Datei umbenennen===========
   ren "%%i" "%ordner% Bild%counter%.avi"

   rem =====hier wird der counter erhöht=====
   set /a counter=%counter%+1
   echo 3) counter=%counter%
)
move "%ordner%\*.jpeg" ""
goto:eof

:countersetzen
set /a counter+=1
echo counter gesetzt: counter=%counter%
goto:eof
```

Das Problem besteht nun darin, dass der counter immer gleich 1 bleibt, obwohl an der stelle "hier wird der counter erhöhrt" der counter gleich 2 oder höher gesetzt werden muss.

Wenn ich nun anstatt "set /a counter=%counter%+1"   "call:countersetzen" schreibe, wird bei ":countersetzen" zwar 2 angezeigt, aber in der For-Schleife ist der counter immer noch 1.

Warum zur Hölle ist das denn so?! Ich komme darauf nicht klar. Hoffe jemand hat eine Lösung für mich.

mfg
jkloea


----------



## deepthroat (4. August 2008)

Hi.

Variablen werden standardmäßig nur einmal beim Lesen des Ausdrucks expandiert. D.h. die Variablen in der FOR Schleife werden immer nur ein einziges Mal expandiert und die Ausgabe bleibt immer gleich.

Du mußt die verzögerte Expansion einschalten und dann statt den Prozentzeichen Ausrufezeichen verwenden:

```
@echo off
setlocal EnableDelayedExpansion

set counter=1

for /d %%n in (*.*) do (
  call:blubb %%n 
)

pause
exit

:blubb

for %%i in ("%1\*.avi") do (
  echo !counter! & set /a counter+=1
)
goto :eof
```
Gruß


----------

