2016-05-04 6 views
1

Ich habe ein Skript Windows-Batch namens test.bat wie folgt:ECHO seltsames Verhalten, wenn sie innerhalb IF-Block

@ECHO OFF 
SETLOCAL 
SET name=Dan 
SET greeting=Hi %name%, how are you? 
ECHO %greeting% 

Wenn er ausgeführt wird ich die folgende Ausgabe:

Hi Dan, how are you? 

Das ist, was ich erwartet hatte. Ich habe das Skript folgendermaßen geändert:

@ECHO OFF 
SETLOCAL 
IF EXIST test.bat (
    SET name=Dan 
    SET greeting=Hi %name%, how are you 
    ECHO %greeting% 
) ELSE (
    ECHO Nofile 
) 

Ich würde erwarten, die gleiche Ausgabe zu erhalten. Stattdessen erhalte ich folgendes:

ECHO is off. 

Bitte kann mir jemand helfen zu verstehen, warum.

Antwort

4

Sie benötigen delayed expansion:

@ECHO OFF 
SETLOCAL enableDelayedExpansion 
IF EXIST test.bat (
    SET name=Dan 
    SET greeting=Hi !name!, how are you 
    ECHO !greeting! 
) ELSE (
    ECHO Nofile 
) 

Die Batch-Dateien haben zwei Phasen Lesen des Drehbuchs - Ausführung und Analyse. Während der Parsing-Phase werden alle mit % eingeschlossenen Variablen ersetzt und während der Ausführungsphase werden die Befehle ausgeführt. Bei eingeschalteter verzögerter Erweiterung werden die mit ! eingeschlossenen Variablen während der Ausführungsphase (dh später)

Klammern auf der anderen Seite (sowie &) erweitert die Befehle in einen Block als einen einzigen Befehl, so dass alle Variablen mit % werden während der ersten Phase ersetzt und wenn Sie Variablen festlegen, müssen Sie verzögerte Expansion.

+0

Können Sie es ausarbeiten? Ich bin mehr daran interessiert zu verstehen, was geht als die Lösung. –

+0

@DanStevens - es wird im Link erklärt, obwohl ich die Antwort – npocmaka

+0

aktualisieren werde Das ist großartig. Vielen Dank! –