2009-01-10 15 views
7

Einige Batch-Dateien unter Windows eine IF-Syntax mit mehreren Linien verwenden, wie unten:Batch-Dateien, Vista x64, wenn und Klammern

if var==rule (
    some comands 
) else (
    else commands 
) 

Nun, Windows Vista x64 beschlossen, alle 32-Bit-Dateien unter „C zu setzen : \ Programme (x86) ". Wenn Sie eine Umgebungsvariable (z. B. PATH) in einer IF ohne Anführungszeichen verwenden, verwirren die Klammern im Wert der Variablen IF, wodurch die Batchdatei abgebrochen wird. Zum Beispiel:

if "%OS%"=="Windows_NT" (
    @setlocal 
    call :set_home 
    set _ARGS=%* 
) else (
    set _SCALA_HOME=%SCALA_HOME% 
    rem The following line tests SCALA_HOME instead of _SCALA_HOME, because 
    rem the above change to _SCALA_HOME is not visible within this block. 
    if "%SCALA_HOME%"=="" goto error1 
    call :set_args 
) 

Eine Batch-Datei mit diesem wird auch wenn die Linie nicht, wo% SCALA_HOME% erscheint erhält nicht ausgeführt. Das ist eher ärgerlich. Gibt es dafür eine Lösung?

Antwort

9

Ändern Sie alle Instanzen von %SCALA_HOME%-!SCALA_HOME!, und fügen Sie den folgenden nahe dem oberen Ende der Datei:

setlocal enableextensions enabledelayedexpansion 

Letztere schaltet „variable Erweiterung verzögert“, was bedeutet, dass !VAR! in Form geschrieben Variablen nicht erweitert, bis sie verwendet werden, und nicht wenn die Anweisung selbst analysiert wird. (In meiner begrenzten Erfahrung, und in diesem Fall sicherlich, bedeutet dies, dass variable Erweiterungen weniger fälschlicherweise als tatsächliche Batchdatei-Syntaxkonstrukte missverstanden werden.) Danke an Patrick Cuff, der auf diese bessere Möglichkeit hingewiesen hat, dies in einem Kommentar zu tun.

P. S .: Wie Sie entdecken, die cmd.exe Batch-Datei Sprache ist schrecklich in vielerlei Hinsicht gebrochen. Wenn Sie keine echte Skriptsprache verwenden können (z. B. wenn Ihre Aufgabe auf anderen Computern ausgeführt werden muss), würde ich ernsthaft empfehlen, ein schnelles C/C++ - Skript, das den Auftrag ausführt, zu löschen und es in .EXE zu kompilieren.

+1

Wenn die verzögerte Erweiterung dieses Problem tatsächlich löst, brauchen Sie kein zweites Batch-Skript, sondern legen Sie 'setlocal enableextensions enabledelayedexpansion' ganz oben in Ihr Skript. –

+0

Ich wusste das nicht, danke Patrick! Viel schöner. –

+0

Ich werde versuchen, setlocal enableextensions aktivierendelayedexpasion verwenden. Wenn es funktioniert, brauche ich eine andere Antwort als akzeptiert. –

Verwandte Themen