ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
9878
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    the-cR ist offline Mitglied Silber
    Registriert seit
    Feb 2002
    Beiträge
    92
    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:

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    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
     

  2. #2
    Retlaw ist offline Mitglied Platin
    Registriert seit
    Jul 2003
    Ort
    Bayern
    Beiträge
    508
    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.
     

  3. #3
    the-cR ist offline Mitglied Silber
    Registriert seit
    Feb 2002
    Beiträge
    92
    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...
     

  4. #4
    Retlaw ist offline Mitglied Platin
    Registriert seit
    Jul 2003
    Ort
    Bayern
    Beiträge
    508
    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.
    Geändert von Retlaw (29.03.04 um 14:27 Uhr)
     

  5. #5
    the-cR ist offline Mitglied Silber
    Registriert seit
    Feb 2002
    Beiträge
    92
    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 :-/
     

  6. #6
    lohokla ist offline Mitglied Gold
    Registriert seit
    May 2003
    Beiträge
    161
    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 /v:on aufrufen. Damit könnte das ganze so aussehen (der Name der Batchdatei, in der der Code steht muss 'test.bat' heißen):
    PHP-Code:
    @echo off
    if %1x==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 
     

  7. #7
    the-cR ist offline Mitglied Silber
    Registriert seit
    Feb 2002
    Beiträge
    92
    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
     

  8. #8
    Retlaw ist offline Mitglied Platin
    Registriert seit
    Jul 2003
    Ort
    Bayern
    Beiträge
    508
    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.
     

Thema nicht erledigt

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 25.08.10, 19:13
  2. Eingabe in der timeline: "time*100" - bei Effekt "turbulentes Versetzen"-"Evolution"
    Von MTMonline im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 2
    Letzter Beitrag: 25.04.08, 09:49
  3. Finder methods + JBoss + Was expecting one of: "CONCAT" "SUBSTRING" ... "(" ... <STRI
    Von cengizhdde im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 6
    Letzter Beitrag: 27.05.05, 15:29
  4. VPN Verbindung blockiert "normale" Verbindung ?
    Von GhostGhost im Forum Netzwerke
    Antworten: 8
    Letzter Beitrag: 24.04.04, 10:51
  5. "kleine" Animation in "großer" Animation in einer Schleife?
    Von Stefan Hönel im Forum Flash Plattform
    Antworten: 6
    Letzter Beitrag: 12.03.04, 17:28