akalexed
Goto Top

Variable in For Schleife bei Batch benutzen

Hallo,

habe eine Batch mir For schleife.

For %%f IN (*.XML) do (

bla bla bla
bla bla bla
bla bla bla

SET FILE=%%f
)

möchte in jedem einzelnen vorgang file benutzen.
FILE ist aber leer.

Wie krieg es hin dass die Batches in der Schleife %%f nicht vergisst?

Content-Key: 161447

Url: https://administrator.de/contentid/161447

Printed on: April 16, 2024 at 16:04 o'clock

Member: LittleFlame
LittleFlame Feb 23, 2011 at 17:26:17 (UTC)
Goto Top
Hallo KarlAlexander,

versuch es mal anstatt mit:

For %%f IN (*.XML) do (

bla bla bla
bla bla bla
bla bla bla

SET FILE=%%f
)

mit

FOR %%f IN (*XML) do (

bla bla bla
bla bla bla
bla bla bla

call :FILESET %%f

)

:FILESET
set FILE = %1


Auch wenn ich mir sicher bin, dass es bessere Lösungen gibt und ich nicht genau weiß, ob meine Denkweise richtig ist.
Wahrscheinlich krieg ich gleich von bastla o.ä. eins übergebraten. ^^

Ich versuch nur zu helfen und zu lernen :-P

Grüße,
LF
Member: Friemler
Friemler Feb 23, 2011 at 17:31:52 (UTC)
Goto Top
Hallo LittleFlame,

Dein Ansatz ist schon richtig. Falls in dem
bla bla bla
bla bla bla
bla bla bla
schon %FILE% benutzt werden soll, muss das alles aber in das Unterprogramm FILESET.

Außerdem würde ich schreiben:
call :FILESET "%%f"
Das verhindert, dass Dateinamen, die Leerzeichen enthalten, zerhackt und statt als EIN Parameter als MEHRERE Parameter übergeben werden.

und
set "FILE=%~1"
Die Tilde entfernt die umgebenden Anführungszeichen von %1. Die Anführungszeichen um FILE=%~1 verhindern, dass sich aus versehen ein Leer- oder Tabzeichen an den Dateinamen in %1 "pappt".

@karlalexander1990
Schau Dir mal mein Tutorial zur FOR-Schleife an, besonders das Kapitel "Exkurs (verzögerte) Variablenerweiterung" und die "Praxistipps". ACHTUNG! Mitdenken und selbst Testprogramme entwickeln und ausprobieren ist gefragt!

Gruß
Friemler
Member: LittleFlame
LittleFlame Feb 23, 2011 at 17:42:56 (UTC)
Goto Top
Hallo Friemler,

also nur, damit ich s auch richtig verstanden habe:

FOR %%f IN (*XML) do
(
call :FILESET "%%f"
)

:FILESET
set "FILE = %~1"
bla bla bla
bla bla bla
bla bla bla


@ Friemler
Wie hebe ich doch gleich Codezeilen hervor?


Schönen Abend an alle,
LF
Member: Friemler
Friemler Feb 23, 2011 at 17:48:54 (UTC)
Goto Top
Hallo LittleFlame,

jepp, richtig. Aber auch an das
exit /b
bzw.
goto :eof
am Ende des Unterprogramms denken face-wink. Von wegen Back to Caller.

Zum formatieren von Codezeilen:
In der Eingabebox für Kommentare gibt es oben einen in ROT face-wink hervorgehobenen Link auf die Formatierungshilfe. Oder Du klickst unter meinem Beitrag auf "Mit Zitat" und schaust Dir an, was ich so getippselt habe.

Gruß
Friemler
Member: aKaLexeD
aKaLexeD Feb 23, 2011 at 18:02:03 (UTC)
Goto Top
Leider, muss die bla bla bla in der for schleife sein.
das heißt: es werden sachen mit FILE ausgeführt und die sollen jedes mal aufgerufen werden sofern ein Datei gefunden wird.

In dem oben angegeben beispiel hab ich zwar %%f übergeben aber kann nur mit dem letzten was anfangen da zuerst di forschleife durchläuft und dann der rest.

Wobei ich ja eigentlich auch so machen kann

FOR %%f IN (*XML) do
(
call :FILESET "%%f"
GOTO NEXT
)

:NEXT
:FILESET
set "FILE = %~1"
bla bla bla
bla bla bla
bla bla bla


ODER?
Kann mir jemand die Lösung innerhalb der schleife geben?
Member: bastla
bastla Feb 23, 2011 at 18:08:40 (UTC)
Goto Top
Hallo KarlAlexander1990!

Eigentlich sollte das so aussehen:
setlocal
FOR %%f IN (*.XML) do (
    call :FILESET "%%f"  
)
goto :eof

:FILESET
set "FILE=%~1"  
bla bla bla
bla bla bla
bla bla bla
goto :eof
wobei Du die Zeilen 2 bis 4 auch zu
FOR %%f IN (*.XML) do call :FILESET "%%f"
zusammenfassen kannst.

Grüße
bastla
Member: Friemler
Friemler Feb 23, 2011 at 18:10:53 (UTC)
Goto Top
Hallo KarlAlexander1990,

Du hast mein Tutorial zur FOR-Schleife noch nicht gelesen. face-wink

Alles, was Du mit der Variablen %FILE% machen willst, muss in ein Unterprogramm, oder Du aktivierst und benutzt die verzögerte Variablenerweiterung. Das ist bei Dateinamen aber gefährlich, da sie ein Ausrufezeichen enthalten könnten, was auch als Steuerzeichen zur Kenntlichmachung von verzögert zu erweiternden Variablen dient => es kommt zu Fehlern.

Gruß
Friemler
Member: bastla
bastla Feb 23, 2011 at 18:17:51 (UTC)
Goto Top
Das ist bei Dateinamen aber gefährlich, da sie ein Ausrufezeichen enthalten könnten, was auch als Steuerzeichen zur Kenntlichmachung von verzögert zu erweiternden Variablen dient => es kommt zu Fehlern.
... wobei es zur Not auch so ginge:
setlocal disabledelayedexpansion
for %%f in (*.XML) do (
    set "FILE=%%f"  
    setlocal enabledelayedexpansion
    echo !FILE!
    type "!FILE!"  
    echo bla bla bla
    endlocal
)
Grüße
bastla
Member: Friemler
Friemler Feb 23, 2011 at 18:20:14 (UTC)
Goto Top
Hi bastla,

geht schon, ist aber HÄSSLICH. face-wink

Gruß
Friemler
Member: bastla
bastla Feb 23, 2011 at 18:22:15 (UTC)
Goto Top
Hallo Friemler!

Auf Widerspruch brauchst Du nicht zu warten ... face-wink

Grüße
bastla
Member: Biber
Biber Feb 23, 2011 at 18:36:40 (UTC)
Goto Top
[OT] Moin Friemler
Zitat von @Friemler:
geht schon, ist aber HÄSSLICH. face-wink
Na ja...
Soll ich mal zum Vergleich ein Foto meiner Ex-Schwiegermutti hochladen?
Da wären auch einige Details nur ganz verzögert zu erweitern...

Grüße
Biber
[/OT]
Member: Friemler
Friemler Feb 23, 2011 at 18:45:57 (UTC)
Goto Top
[OT]
Hi Biber,

nee, lass mal die Ex-Schwiegermutti auf der heimischen Festplatte verstauben. Es gibt Dinge, die die Welt nicht braucht. Hässliche Schwiegermütter/hässlichen Code nimmt man nur im Notfall in Kauf. face-wink

Gruß
Friemler
[/OT]
Member: aKaLexeD
aKaLexeD Feb 24, 2011 at 07:36:00 (UTC)
Goto Top
Bastla deine Lösung ist perfekt.
Danke an alle! =D