Verschachtelung von IF und SET unmöglich?
Hallo,
neue Frage, neues Glück. Wie mir eben aufgefallen ist, scheinen sich Variablenzuweisungen nicht so gut mit Bedingungsgruppierungen zu verstehen.
Folgende Batch-Datei...
beispiel.bat
...erzeugt folgenden Output
Output: beispiel.bat
Warum funktoniert die Zuweisung mittels des SET-Befehles nicht innerhalb der gruppierten Anweisungen der IF-Bedingung?
Ich habe herausgefunden, dass man mittels des Aufrufs von Subroutinen via CALL dennoch ans Ziel gelangen kann. Dies ist allerdings etwas umständlich, weshalb ich mich frage, ob eine solche Verschachtelung (s.o.) doch irgendwie möglich ist.
Gruß,
heny
neue Frage, neues Glück. Wie mir eben aufgefallen ist, scheinen sich Variablenzuweisungen nicht so gut mit Bedingungsgruppierungen zu verstehen.
Folgende Batch-Datei...
beispiel.bat
@echo off
if "a"=="a" (
set test=dies ist ein test
echo %test%
)
pause
...erzeugt folgenden Output
Output: beispiel.bat
ECHO ist ausgeschaltet (OFF).
Drücken Sie eine beliebige Taste . . .
Warum funktoniert die Zuweisung mittels des SET-Befehles nicht innerhalb der gruppierten Anweisungen der IF-Bedingung?
Ich habe herausgefunden, dass man mittels des Aufrufs von Subroutinen via CALL dennoch ans Ziel gelangen kann. Dies ist allerdings etwas umständlich, weshalb ich mich frage, ob eine solche Verschachtelung (s.o.) doch irgendwie möglich ist.
Gruß,
heny
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 82233
Url: https://administrator.de/contentid/82233
Ausgedruckt am: 22.11.2024 um 17:11 Uhr
4 Kommentare
Neuester Kommentar
wenn du 2 Dinge beachtest geht es
1. die Variable innerhalb der if Anweisung mit "!" einschliessen anstatt der "%" Zeichen
2. die cmd in der du das ganze aufrufst mit
cmd /v ausführen
es gab mal eine tolle erklärung dafür, ich bin aber derzeit nur mit GPRS im Internet und das Suchen würde meine Verbindung sprengen
Gruß, Jan
1. die Variable innerhalb der if Anweisung mit "!" einschliessen anstatt der "%" Zeichen
@echo off
if "a"=="a" (
set test=dies ist ein test
echo !test!
)
pause
2. die cmd in der du das ganze aufrufst mit
cmd /v ausführen
es gab mal eine tolle erklärung dafür, ich bin aber derzeit nur mit GPRS im Internet und das Suchen würde meine Verbindung sprengen
Gruß, Jan
Moin Henry,
diese Abfrage if "a"=="a" ( macht doch keinen Sinn! Genauso diese beiden Zeilen in der Bedingungskörper:
@jschneider
zu 1.)
Die 1. Variante setzt bei "@echo off" noch einen 2 Parameter voraus:
zu 2.)
Wie willst du das hinbekommen, wenn du eine Batch z.B. per Doppelklick startest?!
Grüße
Dani
diese Abfrage if "a"=="a" ( macht doch keinen Sinn! Genauso diese beiden Zeilen in der Bedingungskörper:
set test=dies ist ein test
echo %test%
@jschneider
zu 1.)
Die 1. Variante setzt bei "@echo off" noch einen 2 Parameter voraus:
@echo off & setlocal EnableDelayedExpansion
zu 2.)
Wie willst du das hinbekommen, wenn du eine Batch z.B. per Doppelklick startest?!
Grüße
Dani
Moin -heny-,
nur ergänzend zu jschneider:
Statt des Aufrufs "2. die cmd in der du das ganze aufrufst mit cmd /v ausführen" kannst Du auch in der Batchdatei selbst ansagen "Setlocal EnableDelayedExpansion", was neudeutsch ist und sich steht für "verzögerte Variablenauflösung".
Bedeutet, dass die CMD.exe nicht alle in einer Anweisung (z.B. Deiner IF-Anweisung) erscheinenden Variablen gleichzeitig, quasi beim Lesen, auflösen soll, sondern erst beim Ausführen ("verzögert").
Du findest in den Hilfen zu Set/Setlocal/cmd/IF jeweils verständliche beispiele und hier mit der Forumssuche nach "DelayedExpansion" auch ein paar laufende Meter.
Grüße
Biber
[Edit]
@Dani: Sorry, hatte Deinen Kommentar noch nicht gesehen.
Wie willst du das hinbekommen, wenn du eine Batch z.B. per Doppelklick startest?!
--> indem Du es in der Registry eingetragen hast...
@-heny- "...unmöglich? " Nur Brotschneiden ist mit Batchen unmöglich...
[/Edit]
nur ergänzend zu jschneider:
Statt des Aufrufs "2. die cmd in der du das ganze aufrufst mit cmd /v ausführen" kannst Du auch in der Batchdatei selbst ansagen "Setlocal EnableDelayedExpansion", was neudeutsch ist und sich steht für "verzögerte Variablenauflösung".
Bedeutet, dass die CMD.exe nicht alle in einer Anweisung (z.B. Deiner IF-Anweisung) erscheinenden Variablen gleichzeitig, quasi beim Lesen, auflösen soll, sondern erst beim Ausführen ("verzögert").
Du findest in den Hilfen zu Set/Setlocal/cmd/IF jeweils verständliche beispiele und hier mit der Forumssuche nach "DelayedExpansion" auch ein paar laufende Meter.
Grüße
Biber
[Edit]
@Dani: Sorry, hatte Deinen Kommentar noch nicht gesehen.
Wie willst du das hinbekommen, wenn du eine Batch z.B. per Doppelklick startest?!
--> indem Du es in der Registry eingetragen hast...
@-heny- "...unmöglich? " Nur Brotschneiden ist mit Batchen unmöglich...
[/Edit]