Problem mit Windows Batch Script
Eine Variable kann innerhalb eienr For Schleife nicht ausgelesen werden.
Ich habe da ein Problem mit einer simplen Batch datei.
set /A zaehler=0
for %%f in (C:\ordner\*.JPG) do (
set /A zaehler=zaehler+1
echo %zaehler%
)
echo %zaehler%
Wieso wird ist die Variable %zaehler% innerhalb der For-Schleife "0"?
Nach der For Schleife kann Sie ausgelesen werden.
set /A zaehler=0
for %%f in (C:\ordner\*.JPG) do (
set /A zaehler=zaehler+1
echo %zaehler%
)
echo %zaehler%
Wieso wird ist die Variable %zaehler% innerhalb der For-Schleife "0"?
Nach der For Schleife kann Sie ausgelesen werden.
Please also mark the comments that contributed to the solution of the article
Kommentar vom Moderator Biber am Jan 04, 2011 um 16:59:32 Uhr
Verschoben von "Tools & Utilities" nach "Batch & Schnelles".
Content-Key: 158004
Url: https://administrator.de/contentid/158004
Printed on: April 19, 2024 at 12:04 o'clock
8 Comments
Latest comment
Hallo swissgregi und willkommen im Forum!
@Christian25
Grüße
bastla
Wieso wird ist die Variable %zaehler% innerhalb der For-Schleife "0"?
Weil bei Schleifen (sind für den Interpreter eine einzige Zeile) defaultmäßig die Werte der Variablen nur zu Beginn ermittelt bzw "erweitert" werden (der Wert kann, wie Dein Beispiel ja zeigt, zwar innerhalb der Schleife verändert werden, das Ergebnis wird aber erst nach der Schleife wieder "gelesen") - um das zu ändern, entweder "delayedExpansion" oder ein Unterprogramm verwenden - ungetestetes Beispiel für erstere Version:setlocal enabledelayedexpansion
set /A zaehler=0
for %%f in (C:\ordner\*.JPG) do (
set /A zaehler+=1
echo !zaehler!
)
echo %zaehler%
/a nur beim rechnen...
Was soll daran Schlimmes sein, wenn eine Variable ihren (numerischen) Wert per "set /a
" zugewiesen erhält? Betrachte es als Berechnung, bei der eine Konstante mit keinem weiteren Wert "verrechnet" wird ... Grüße
bastla
Hi,
sieht dir noch mal Bastla's Batch an !
Die Variablen, dessen Werte sich dynamisch ändern, müssen in Ausrufezeichen (!) anstelle der Prozentzeichen (%) geschrieben werden.
Ups... da stand noch etwas Text unter dem Batch...
Aber das "start enfuse..." sollte noch in den Anweisungsblock der dritten IF-Anweisung, damit dieses auch nur aufgerufen wird wenn es der dritte Schleifendurchlauf ist und nicht bei jedem einzelnem (zudem noch mit falschen Parametern)
~Arano
sieht dir noch mal Bastla's Batch an !
Die Variablen, dessen Werte sich dynamisch ändern, müssen in Ausrufezeichen (!) anstelle der Prozentzeichen (%) geschrieben werden.
Ups... da stand noch etwas Text unter dem Batch...
Aber das "start enfuse..." sollte noch in den Anweisungsblock der dritten IF-Anweisung, damit dieses auch nur aufgerufen wird wenn es der dritte Schleifendurchlauf ist und nicht bei jedem einzelnem (zudem noch mit falschen Parametern)
~Arano
Moin swissgregi,
willkommen im Forum.
Die Mimik mit "erweiterter Variablenauflösung", neudeutsch "delayed expansion" ist zweistufig.
a) die Ankündigung "ich will es nutzen, ermögliche es mir" = Direktive "SetLocal EnableDelayedExpansion"
b) die explizite Kennzeichnung derjenigen Variablen, die du "verzögert", erst im allerletzten Moment, "auflösen" bzw wertmäßig ermitteln willst durch die Schreibweise !variable! statt %variable%
In deinem Fall musst du dann also, wenn du innerhalb einer [FOR-]Anweisung eine Variable SETtest und deren neu gesetzten Wert verwenden willst, in den IF-Prüfungen jeweils "IF !zaehler1!==1" etc, schreiben statt "IF %zaehler1%==1" und im "Start enfuse"-Aufruf auch !dat1!, !dat2!, !dat3! statt %dat1%, %dat2%, dat3%.
Siehe auch in bastlas Beispiel.
Grüße
Biber
willkommen im Forum.
Die Mimik mit "erweiterter Variablenauflösung", neudeutsch "delayed expansion" ist zweistufig.
a) die Ankündigung "ich will es nutzen, ermögliche es mir" = Direktive "SetLocal EnableDelayedExpansion"
b) die explizite Kennzeichnung derjenigen Variablen, die du "verzögert", erst im allerletzten Moment, "auflösen" bzw wertmäßig ermitteln willst durch die Schreibweise !variable! statt %variable%
In deinem Fall musst du dann also, wenn du innerhalb einer [FOR-]Anweisung eine Variable SETtest und deren neu gesetzten Wert verwenden willst, in den IF-Prüfungen jeweils "IF !zaehler1!==1" etc, schreiben statt "IF %zaehler1%==1" und im "Start enfuse"-Aufruf auch !dat1!, !dat2!, !dat3! statt %dat1%, %dat2%, dat3%.
Siehe auch in bastlas Beispiel.
Gibt es da eine bessere Lösung?
Besser als in diesem Forum? Gibt es billigere Optiker als Fielmann? Ist der Papst geschieden?Grüße
Biber
Moin,
[1/2 OT]
mal ein kleines Demo am Prompt das Zeichen _ ist der Cursor (also ein Leerzeichen) und kein Unterstrich
zum Gegenbeweis mit /a
Von daher
[/1/2 OT]
komplett andere Ansätze für mich schon zu spät am Abend....
Gruß
[1/2 OT]
mal ein kleines Demo am Prompt das Zeichen _ ist der Cursor (also ein Leerzeichen) und kein Unterstrich
>set test=1_
>echo "%test%"
>"1 "
>set /a test=1_
>echo "%test%"
>"1"
[/1/2 OT]
Gibt es da eine bessere Lösung?
Möglicherweise "besser" aber für "bessere" Lösungen for /r C:\autopano\input\sempach %%f in (*.jpg) do .....
Gruß
moin swissgregi,
wenn Du einen Pfad zu einer Ausfürbaren Datei in die UmgebungsVariable PATH aufnimmst - wird das Programm gefunden und ausgefüht
soll der Batch nur bei jeder einzelnen Ausführung die 3 Dateien Übergeben (gehe ich mal davon aus)
dann in etwa so
[Edit]
wenn die *.jpg's beim bearbeiten mit dem Programm NICHT verschoben oder NICHT gelöscht werden, musst Du mit einer Art Liste arbeiten.
oder
die *.jgs's danach aus diesem Ordner herauslösen - wobei da der Befehl start enfuse.exe entweder als start /w ... oder ohne Start durchgefüht werden sollte.
- "usebackq" aus der 2. Forschleife entfernt
und willkommen im Forum
[/Edit]
Gruß Phil
Leider funktioniert das nicht. Ich habe hier mal das "Original" Skript:
Da ist ja auch eine Schliessende Klammer in Zeile 16 zuviel (welche aber nicht zum Scriptabbruch führen dürfte)wenn Du einen Pfad zu einer Ausfürbaren Datei in die UmgebungsVariable PATH aufnimmst - wird das Programm gefunden und ausgefüht
soll der Batch nur bei jeder einzelnen Ausführung die 3 Dateien Übergeben (gehe ich mal davon aus)
dann in etwa so
@echo off
setlocal
set "Path=C:\Program Files\Hugin2010.4.0\bin;%Path%"
set "InputPath=C:\autopano\input\sempach\"
pushD "%InputPath%"
set /A Anzahl = 3 , NR = 0
set "Files="
for "tokens=1* delims=:" %%i in ('dir /b *.JPG^|findstr "^"') do if %%i leq %Anzahl% (
set "dat="%%j""
set /a NR = %%i
setlolocal enabledelayedexpansion
for /f "delims=" %%j in ("!Files! !dat!") do endlocal&set "Files=%%j"
)
start enfuse.exe enfuse --wExposure=1 --wSaturation=0.5 --wContrast=0 --wMu=0.5 --wSigma=0.2 --HardMask --depth=8 -o output.tif %Files%
echo %NR%
popD
[Edit]
wenn die *.jpg's beim bearbeiten mit dem Programm NICHT verschoben oder NICHT gelöscht werden, musst Du mit einer Art Liste arbeiten.
oder
die *.jgs's danach aus diesem Ordner herauslösen - wobei da der Befehl start enfuse.exe entweder als start /w ... oder ohne Start durchgefüht werden sollte.
- "usebackq" aus der 2. Forschleife entfernt
und willkommen im Forum
[/Edit]
Gruß Phil