halo7one
Goto Top

Erweitertes for - interpretation von !und! in variable?

Wie wird ein "&" in einer variable interpretier, die durch "!" sofort ersetzt werden soll?

Hi @ all,

ich habe folgendes Problem/Frage mit/zu einem Code wie diesem:
@echo off & SETLOCAL EnableDelayedExpansion
set "echo6=echo test 1 & echo test 2"  
set "number=6"  
set "option6=true"  

for /l %%n in (1,1,%number%) do (
if "!option%%n!"=="true" (  
echo das soll gemacht werden: !echo%%n!
!echo%%n!
echo %echo6%
))
pause
Wie wird hier das "&" in "!echo%%n!" interpretiert (also ich meine allgemein)? So wie ich das sehe wird es nicht als Trennzeichen für mehrere Befehle interpretiert sondern als normales Zeichen, als wenn ich "^&" schreiben würde.

Kann mir jemand sagen wie es sich damit verhält und wie ich das "&" als Trennzeichen interpretiert bekomme?

Und evtl. erwähnt auch jemand die korrekte Bezeichnung der Zeichen/Operatoren (wie auch immer) "&" "^" und "!" (bei for mit Befehlserweiterung) XD

MfG,
halo7one

Content-ID: 90290

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

Ausgedruckt am: 20.11.2024 um 04:11 Uhr

bastla
bastla 20.06.2008 um 18:22:05 Uhr
Goto Top
Hallo halo7one!

Der unten verlinkte Artikel beantwortet (hoffentlich) einige Deiner Fragen (auch Bezeichnung und Funktion von "Ampersand" (&) und "Caret" (^) werden erwähnt), allerdings geht für mich daraus (siehe unterhalb von "Parsing and executing a batch script") auch hervor, dass sich Deine Absicht nicht wird umsetzen lassen: http://cypressor.twoday.net/stories/4480453/

So unschön das auch ist, aber eine bessere Idee als etwa
@echo off & SETLOCAL EnableDelayedExpansion
set "echo6=echo test 1 & echo test 2"  
set "number=6"  
set "option6=true"  

for /l %%n in (1,1,%number%) do (
    if "!option%%n!"=="true" (  
        echo echo das soll gemacht werden: !echo%%n!
        call :Opt%%n
    )
)
pause
goto :eof

:Opt1
%echo1% & goto :eof

::
::

:Opt6
%echo6% & goto :eof
habe ich derzeit nicht. Damit hättest Du zumindest (im Vergleich zu einem direkten "call :Opt%%n" oder "goto :Opt%%n" und Festlegung der Befehle erst im Unterprogramm) die Möglichkeit, durch die Zuweisung zu den einzelnen %echo#%-Variablen alle Befehlszeilen gesammelt an den Anfang des Batches setzen zu können - ob's das allerdings bringt ...

Grüße
bastla

P.S.: Mal schauen, was Biber dazu einfällt ...
Biber
Biber 21.06.2008 um 00:19:23 Uhr
Goto Top
Moin halo7one und bastla,

da fällt mir kaum etwas ein... außer: KISS... Keep It Simple, Stupid!

Ich kann es so testen:
::--- snipp 2echoes.cmd
@echo off & setlocal disableDelayedExpansion
set "twoechoes=echo one & echo two"  
echo [1]%twoechoes%
echo [2]"%twoechoes%"  
echo [3]^"%twoechoes%^"  
echo [4] test ausführen %%twoechoes%%
%twoechoes%
echo [5] Ausführen !twoechoes! mit DelayedExpansion
setlocal enableDelayedExpansion
!twoechoes!
endlocal
::Runde 2
set "echoes3_andmore=echo three & echo four"  
for /l %%i in (1,1,3) do if defined echoes%%%i_andmore (
 echo [1b]!echoes%%i_andmore!
echo [2b]"!echoes%%i_andmore!"  
echo [3b]^"!echoes%%i_andmore!^"  
echo [4b] Ausführen ^!echoes%%i_andmore^! mit DelayedExpansion
setlocal enableDelayedExpansion
!echoes%%i_andmore!
endlocal

echo [5b] Ausführen ^!echoes%%i_andmore^! mit DelayedExpansion
setlocal enableDelayedExpansion
cmd /c !echoes%%i_andmore!
endlocal
)
goto :eof
Output:
>2echoes.cmd
[1]echo one
two
[2]"echo one & echo two"  
[3]"echo one  
two"  
[4] test ausführen %twoechoes%
one
two
[5] Ausführen !twoechoes! mit DelayedExpansion
one & echo two
[1b]!echoes3_andmore!
[2b]"!echoes3_andmore!"  
[3b]"!echoes3_andmore!"  
[4b] Ausführen !echoes3_andmore! mit DelayedExpansion
three & echo four
[5b] Ausführen !echoes3_andmore! mit DelayedExpansion
three
four

Die Varianten 4 OHNE DelayedExpansion und 5b MIT DelayedExpansion funktionieren.

Grüße
Biber
halo7one
halo7one 21.06.2008 um 13:03:06 Uhr
Goto Top
Ah vielen Dank bastla & Biber,
auf die Variante 5b mit cmd /c, die ich brauche, wäre ich nie gekommen!

Und wieder ist ein Problem gelöst ;)

Nur noch eine Frage zu deinem Code Biber: warum hast du bei
for /l %%i in (1,1,3) do if defined echoes%%%i_andmore
3mal % geschrieben und nicht 2?

Gruß zurück,
halo7one
Biber
Biber 21.06.2008 um 13:40:47 Uhr
Goto Top
Moin halo7one,

warum hast du bei
for /l %%i in (1,1,3) do if defined echoes%%%i_andmore
3mal % geschrieben und nicht 2?

Weil Biber in meinem Alter um diese Uhrzeit speziell Freitagabends doch ziemlich schnell abbauen.
War ein ganz normaler Tippfehler - 2 %-Zeichen reichen natürlich.

Grüße
Biber
bastla
bastla 21.06.2008 um 13:48:03 Uhr
Goto Top
... und ich hatte schon auf jugendlichen Übermut getippt ... face-wink

Grüße
bastla
Biber
Biber 21.06.2008 um 14:05:47 Uhr
Goto Top
@bastla
Eine andere Interpretation wäre
  • ein Prozentzeichen = Kennzeichen für Laufvariablen am CMD
  • zwei Prozentzeichen = Kennzeichen für Laufvariablen im Batch
  • drei Prozentzeichen = Kennzeichen für Promille

Grüße
Biber