# Batchskript: for Schleife in Verbindung mit "set"



## the-cR (29. März 2004)

Hallo,

ich habe ein Problem mit einem Windows Batchskript. Ich möchte innerhalb einer for Schleife den set Befehl setzen, um eine Umgebungsvariable zu erstellen. Meine Schleife sieht in etwa so aus:


```
set fsize=0
for %%x in (c:\temp\test\*.jpg) do (
 
  set fsize=123
  echo %fsize%
    
)
```

Man sieht hier, dass ich die Variable "fsize" in der Schleife auf 123 setze. Leider funktioniert das nicht, "fsize" hat immer den Wert 0, wie das "echo %fsize%" zeigt. Die Schleife durchläuft übrigens alle .jpg Bilder in dem Verzeichnis, was für dieses set-Problem eigentlich nicht relevant sein dürfte.

Falls jemand weiss, warum das set hier nicht funktioniert, der solle mir mal die Augen öffnen 

Für Hilfe wäre ich sehr dankbar


----------



## Retlaw (29. März 2004)

Lass das "set fsize=0" am Anfang weg dann gehts.
Frag mich aber nicht wiso 
Könnte vielleicht was mit dem Gültigkeitsbereich zu tun haben.


----------



## the-cR (29. März 2004)

Hallo,

es ist leider nicht ganz so einfach. Es sieht nur so aus, als ob es ginge - wenn 123 einmal in die Variable geschrieben wurde, ist ihm das 2. egal. Zu testen ist das, wenn Du in der Schleife den Wert veränderst, z.B. auf den aktuellen Dateinamen setzt (%%x).

Ich frag mich wikrklich warum das so ist...


----------



## Retlaw (29. März 2004)

Sieht aus als ob jeder Befehl in einer eigenen Kommandozeile ausgeführt wird, was Probleme mit dem Gültigkeitsbereich geben würde oder die Schleife zuerst "vorkompiliert" wird und dabei der aktuelle Wert der Variablen zum Schleifenbeginn fest übernommen wird für alle weiteren Durchläufe.

Sicher bin ich mir da nicht, ist jedenfalls mein Eindruck nach ein paar Testversuchen.

Lösung: anständige Skriptsprache verwenden  

/Edit:
Habs gefunden,
die Ursache des Problems:
Anscheinend wird beim echo der Wert am Schleifenbegin für jeden Durchlauf verwendet.
Die Set-Anweisung funktioniert also einwandfrei, nur die Ausgabe über echo nicht.
Testen kannst du das indem du den Inhalt mit "Set Variablenname" in der Schleife anzeigen lässt.


----------



## the-cR (29. März 2004)

Stimmt da hast Du recht, ich habe mir die Variable bisher nicht mit set angeschaut.

Möglicherweise liegt dann also das Problem beim Zugriff auf die Variable mit %fsize% - also dem Umschliessen des Namens mit "%".

Da ich nun weiß, dass die Variable korrekt gesetzt wird, stellt sich nun das Problem, wie ich sie verwende.

Sollte ich z.B. in der Schleife die Zeile

"if %fsize% LSS 50000 del %%x"

hinzufügen, klappt das nicht, da %fsize% hier nicht aufgelöst werden kann. (Die Zeile sollte z.B. alle Dateien löschen, die kleiner als 50000 Bytes sind).

Es kommt mir auch komisch vor, dass man innerhalb von Batchdateien zwei "%" bei der "Zählervariable" (in meinem Fall "%%x") benutzen muss, an der Kommandozeile jedoch nur ein "%". Möglicherweise liegt hier das Problem, da "%fsize%" auch irgendwie mit zwei "%%" verwendet werden muss.

Leider konnte ich bis jetzt noch nichts herausfinden :-/


----------



## lohokla (29. März 2004)

Erster Lösungsvorschlag:


> Lösung: anständige Skriptsprache verwenden


 - Wozu schwer wenn es auch einfach geht? Mit Batch ist das alles sehr umsändlich - ich denk mal es wird später schwer an die Dateigröße zu kommen.

Zweiter Lösungsvorschlag:
Damit die Variable für den Echobefehl "aktualisiert" wird musst du cmd mit der Option /vn aufrufen. Damit könnte das ganze so aussehen (der Name der Batchdatei, in der der Code steht muss 'test.bat' heißen):

```
@echo off
if %1x==x goto eins
if %1==zwei goto zwei

:eins
cmd /V:on /c test.bat zwei
goto:eof

:zwei
set fsize=
for %%x in (1 2) do (
  set fsize=%%x
  echo !fsize!
)
exit
goto:eof
```


----------



## the-cR (29. März 2004)

Hallo,

danke für Deine / Eure Hilfe, nun funktioniert es. Ich kannste diese Verzögerte Erweiterung von Variablen nicht.

Mal ne Frage - ich mache nur sehr wenig bzw. kleine Dinge mit Batchdateien, um mir hier und da mal etwas zu erleichern. Ich habe nebenbei die CygWin bin's auf der Platte, um auch diese Linux Befehle verwenden zu können.

Somit kann ich auch bash Skripte schreiben und ausführen - wäre die Bash Skriptsprache (die mir sehr mächtig aussieht) etwas, was man lieber verwenden sollte bzw. wäre es eine gute Alternative? Oder habt ihr noch eine bessere Sprache inkl. Interpreter?

Vielen Dank


----------



## Retlaw (30. März 2004)

Unix Shellskripte haben einen bei weitem größeren Funktionsumfang als Batch und sind einfach zu verwenden.

Für welche Sprache du dich entscheidest bleibt natürlich dir überlassen.
Eine Entscheidungshilfe ist auch das Einsatzgebiet. Shellskripte kannst du eben auch unter Unix/Linux einsetzen, aber mit einer Microsoft Sprache wie z.B. Visual Basic Script (VBS) aus dem Windows Scripting Host (WSH) unterstützt auch Dinge wie Zugriff auf die Registry und sind geeignet wenn du vorhast später tiefer in die Skriptprogrammierung unter Windows einzusteigen.
Bei Shellskripten musst du halt zusätzliche Software unter Windows installieren und bei WSH bekommst kostenlose Sicherheitslücken dazu, die du aber eh hättest wenn WSH bereits installiert ist.
Falls du JavaScript kennst und die Syntax ansprechender findest gibts auch JS aus dem WSH.


----------

