2009-11-06 3 views
10

Ich hatte ein Problem mit set nicht in einer Batch-Datei arbeiten; es dauerte eine Weile, das Problem zu destillieren; zuerst dachte ich, es mit Subroutinenaufrufe ...DOS-Batch: SET-Variable und ECHO es innerhalb (...) Block

Das Skript

@echo off 
setlocal 
set a=aaa 
echo a = "%a%" 
(
set b=bbb 
echo b = "%b%" 
) 

erzeugt die Ausgabe

a = "aaa" 
b = "" 

während ich

a = "aaa" 
b = "bbb" 

erwarten würden, zu tun war, Warum ist das bitte? Ist es ein Fehler in DOS? Vielleicht gibt es etwas über die Befehlsgruppierungssyntax (...), die mir nicht bekannt ist.

Danke.

Antwort

10

Benutzer verzögerte Expansion und! anstelle von%

@echo off 
setlocal enableextensions enabledelayedexpansion 
set a=aaa 
echo a = "%a%" 
(
set b=bbb 
echo b = "!b!" 
) 
+0

Danke für die knappe Antwort. Wissen Sie zufällig, ob es eine Syntax für die nummerierten Parameter% 1 usw. gibt? Ich habe es versucht! 1 und! 1 !, aber diese funktionieren nicht. (Ich frage dies im Zusammenhang mit einem: Unterprogrammaufruf.) – Rhubbarb

+1

Da sie nicht zwischen Parsing und Ausführung ändern können, wie% a% type Variablen können, kann ich nicht sehen, dass es darauf ankommt. –

+0

Sie haben Recht. Ich hatte andere Probleme mit dem Skript, das dann die gleichen Symptome zeigte. Problem gelöst. Vielen Dank (an alle). – Rhubbarb

6

Sie müssen die verzögerte Erweiterung aktivieren oder der Batch-Interpreter interpoliert alle Variablen zur Parsing-Zeit anstelle der Laufzeit.

setlocal enableextensions enabledelayedexpansion 

Siehe this question für ein Beispiel und einige großartige Erklärung davon.

7

Was passiert ist, dass der Batch-Interpreter als alles zwischen den Klammern eine einzige Zeile behandelt. Dies bedeutet, dass es einen variablen Ersatz für alles zwischen den Klammern vor dem Ausführen eines der Befehle durchführt. So

:

(
set b=bbb 
echo b = "%b%" 
) 

Becomes:

(
set b=bbb 
echo b = "" 
) 

Die Variable b gesetzt wird, aber offensichtlich nicht gesetzt ist, bevor Sie den SET Befehl ausführen.