for schleife, Variable wird gesetzt, aber beim Echo wird die Variable nicht angezeigt
Hallo Zusammen,
Ich hoffe ich habe nicht falsch gesucht und das Thema, dass ich hier anspreche wurde schon zig-Mal angeschaut...
Na jedenfalls habe ich den Folgenden Code:
Und wenn ich ein Echo on habe sehe ich, dass die Variable definiert wird, aber beim Echo die Variable in "vergessenheit" geht... Es heisst nur immer "Echo ist on" oder so ähnlich... Kann mir da jemand helfen ?
Ich danke schon im voraus
Mit freundlichen Grüssen
Blueberry
Ich hoffe ich habe nicht falsch gesucht und das Thema, dass ich hier anspreche wurde schon zig-Mal angeschaut...
Na jedenfalls habe ich den Folgenden Code:
for /f "delims=" %%i in ('dir /ad /s /b "C:\Programme\Acronis"') do (
Set pfad=%%i
echo %pfad%
pause)
Ich danke schon im voraus
Mit freundlichen Grüssen
Blueberry
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 104500
Url: https://administrator.de/contentid/104500
Ausgedruckt am: 25.11.2024 um 20:11 Uhr
8 Kommentare
Neuester Kommentar
Moin Blueberry,
für den CMD-Interpreter ist die FOR-Anweisung, auch wenn sie über mehrere Zeilen formatiert geschrieben wird, eine einzige Anweisung und erst mit der schliessenden Klammer-Zu beendet.
Alle Variablen der Form %var% werden entsprechen einmalig aufgelöst, nämlich dann, wenn diese Zeile als syntaktisch verwertbar eingestuft wurde und die Ausführung losgehen kann.
Wenn die Variablen innerhalb dieser Anweisung neu gesetzt und neu ausgelesen werden, dann musst Du die so genannte "verzögerte Variablenauflösung" oder aus Neudeutsch "Delayed Expansion" aktivieren.
Diejenigen Variablen, die immer erst "zum Zeitpunkt des Anfassens" aufgelöst werden sollen, müssen dann in der Form !var! statt %var% geschrieben werden.
Grüße
Biber
für den CMD-Interpreter ist die FOR-Anweisung, auch wenn sie über mehrere Zeilen formatiert geschrieben wird, eine einzige Anweisung und erst mit der schliessenden Klammer-Zu beendet.
Alle Variablen der Form %var% werden entsprechen einmalig aufgelöst, nämlich dann, wenn diese Zeile als syntaktisch verwertbar eingestuft wurde und die Ausführung losgehen kann.
Wenn die Variablen innerhalb dieser Anweisung neu gesetzt und neu ausgelesen werden, dann musst Du die so genannte "verzögerte Variablenauflösung" oder aus Neudeutsch "Delayed Expansion" aktivieren.
SetLocal EnableDelayedExpansion
for /f "delims=" %%i in ('dir /ad /s /b "C:\Programme\Acronis"') do (
Set pfad=%%i
echo !pfad!
pause)
Grüße
Biber
Hallo Blueberry!
Wenn Du ohnehin ein Unterprogramm verwenden wolltest, wäre "delayedExpansion" gar nicht erforderlich - das sähe dann so aus:
Im "sub1" kommmt der übergebene Pfad als erster (und hier einziger) Paramer (%1) an. Mit der Schreibweise %~1 werden die den Parameter umgebenden Anführungszeichen entfernt.
Das "goto :eof" in Zeile 3 sorgt dafür, dass das Unterprogramm nach dem Ende der Schleife nicht noch ein weiteres Mal durchlaufen wird, und das "goto :eof" ("Beende das Unterprogramm und springe zurück ins Hauptprogramm!") in der letzten Zeile wäre gar nicht nötig - es dient nur als Vorsichtsmaßnahme, falls (zukünftig) noch ein weiteres Unterprogramm oder ein Sprung vom Hauptprogramm zu einem "Ende"-Teil folgen sollte.
Grüße
bastla
Wenn Du ohnehin ein Unterprogramm verwenden wolltest, wäre "delayedExpansion" gar nicht erforderlich - das sähe dann so aus:
@echo off & setlocal
for /f "delims=" %%i in ('dir /ad /s /b "C:\Programme\Acronis"') do call :sub1 "%%i"
goto :eof
:sub1
set "pfad=%~1"
echo %pfad%
:: was sonst noch anliegt
pause
goto :eof
Das "goto :eof" in Zeile 3 sorgt dafür, dass das Unterprogramm nach dem Ende der Schleife nicht noch ein weiteres Mal durchlaufen wird, und das "goto :eof" ("Beende das Unterprogramm und springe zurück ins Hauptprogramm!") in der letzten Zeile wäre gar nicht nötig - es dient nur als Vorsichtsmaßnahme, falls (zukünftig) noch ein weiteres Unterprogramm oder ein Sprung vom Hauptprogramm zu einem "Ende"-Teil folgen sollte.
Grüße
bastla
Hallo Blueberry!
Mein Beispiel oben war für ein internes Unterprogramm gedacht - wenn in einem aufgerufenen externen Batch an einer bestimmten Stelle gestartet werden soll, musst Du dies auch dort festlegen, etwa:
Jetzt kannst Du den "call" aus Deinem Beispiel verwenden und es wird sofort zu der als Parameter angegebenen Stelle gesprungen - falls es diese nicht geben sollte, bricht der Batch allerdings ab ...
Mehr Kontrolle (aber auch mehr Aufwand) hast Du, wenn Du jedes mögliche Sprungziel abfragst, also etwa
Grüße
bastla
Mein Beispiel oben war für ein internes Unterprogramm gedacht - wenn in einem aufgerufenen externen Batch an einer bestimmten Stelle gestartet werden soll, musst Du dies auch dort festlegen, etwa:
@echo off & setlocal
if "%~1" neq "" goto %~1
Mehr Kontrolle (aber auch mehr Aufwand) hast Du, wenn Du jedes mögliche Sprungziel abfragst, also etwa
@echo off & setlocal
if "%~1"=="" goto :NormalStart
if "%~1"==":sub1" goto :sub1
if "%~1"==":sub2" goto :sub2
:: und so weiter
echo Das Sprungziel "%~1" wurde nicht gefunden ...
goto :eof
:NormalStart
echo Start erfolgte ohne Parameter
::
goto :eof
:sub1
echo Starte bei ":sub1"
::
goto :eof
:sub2
echo Starte bei ":sub2"
::
goto :eof
Grüße
bastla
Hallo Blueberry!
folgende Parametervariablen liefern:
Wie zu erkennen ist, werden umgebende Anführungszeichen, egal ob erforderlich (wie für "Param Zwei") oder nicht, in der Variablen "mitgeliefert". Um sicher sein zu könnnen, dass keine solchen Anführungszeichen in der Variablen stehen, können diese mit der Schreibweise
entfernt werden (was ich zumeist gewohnheitsmäßig mache); waren ohnehin keine da, ist dies auch kein Problem - im Ergebnis sind auf jeden Fall keine Anführungszeichen mehr vorhanden.
Grüße
bastla
warum wird die Marke "sub1" als %~1 übergeben ?
Falls sich die Frage tatsächlich vor allem auf die "1" bezieht: Es handelt sich tatsächlich um die Ziffer. Jeder Batch kann die Parameter %0 bis %9 verwenden, wobei %0 die Batchdatei selbst repräsentiert und ab %1 die an den Batch übergebenen Parameter - ein in "C:\Scripts\Params.cmd" gespeicherter Batch würde bei einem Aufruf mitC:\Scripts\Params.cmd ParamEins "Param Zwei" "ParamDrei"
%0=C:\Scripts\Params.cmd
%1=ParamEins
%2="Param Zwei"
%3="ParamDrei"
%~2
Grüße
bastla