Komisch Geltungsbereich Problem .bat-Datei
Schreibe ich eine einfache .bat-Datei, und ich habe in einige seltsame Verhalten. Es gibt ein paar Orte, wo ich zu tun haben, eine einfache if/else, aber der code innerhalb des blocks scheinen nicht ordnungsgemäß.
Hier ist ein einfacher Fall, der zeigt den Fehler:
@echo off
set MODE=FOOBAR
if "%~1"=="" (
set MODE=all
echo mode: %MODE%
) else (
set MODE=%~1
echo mode: %MODE%
)
echo mode: %MODE%
Die Ausgabe, die ich bekommen hab ist:
C:\>test.bat test
mode: FOOBAR
mode: test
Warum ist das echo innerhalb der code-block nicht immer der neue Wert der variable? In den eigentlichen code, den ich Schreibe, dass ich brauchen, um zu bauen ein paar Variablen und referenzieren Sie im Rahmen der if/else. Ich konnte diesen Schalter zu verwenden, labels und gotos statt einer if/else, aber das scheint nicht annähernd so sauber.
Was dieses Verhalten verursacht? Gibt es irgendeine Art von Grenze auf Variablen innerhalb von Codeblöcken?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie laufen in das problem von cmd statische variable expansion. Die MODE-variable wird nur einmal ausgewertet. Sie können sehen, wenn du weglassen, die @echo off-Zeile.
Vom set /? Dokumentation:
setlocal EnableDelayedExpansion
ermöglichen, werden die /v-flag
Sieht aus wie das Lesen und schreiben verwenden unterschiedliche Bereiche Regeln.
Wenn Sie beseitigen diese Zeile
es wie erwartet funktionieren wird. So werden Sie wahrscheinlich benötigen, um eine komplexe Reihe wenn/Neubauten zu erhalten, werden die Variablen gefüllt, wie Sie möchten.