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:
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 90290
Url: https://administrator.de/contentid/90290
Ausgedruckt am: 20.11.2024 um 04:11 Uhr
6 Kommentare
Neuester Kommentar
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
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 ...
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
Grüße
bastla
P.S.: Mal schauen, was Biber dazu einfällt ...
Moin halo7one und bastla,
da fällt mir kaum etwas ein... außer: KISS... Keep It Simple, Stupid!
Ich kann es so testen:
Output:
Die Varianten 4 OHNE DelayedExpansion und 5b MIT DelayedExpansion funktionieren.
Grüße
Biber
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
>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
@bastla
Eine andere Interpretation wäre
Grüße
Biber
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