2010-05-05 7 views
5

Ich habe ein Windows-Batch-Script-Problem, gegen das ich meinen Kopf breche (kein Wortspiel beabsichtigt). Die problematische Skript sieht wie folgt aus:Wie man PATH auf einen anderen Variablenwert mit Leerzeichen in der Windows-Batch-Datei setzt

if defined _OLD_VIRTUAL_PATH (
    set PATH=%_OLD_VIRTUAL_PATH% 
) 

Wenn ich es laufen und _OLD_VIRTUAL_PATH gesetzt ich:

\Microsoft was unexpected at this time. 

_OLD_VIRTUAL_PATH eine Variable, die ursprünglich aus PATH gesetzt wurde und es Leerzeichen enthält - ich bin ziemlich sicher, das ist das Problem. Aber was ist die Lösung? Es wird erfolgreich ausgeführt, wenn ich es in Anführungszeichen eingeschlossen habe, aber ich denke nicht, dass der gesamte Wert der PATH-Variable in Anführungszeichen gesetzt werden soll.

Antwort

7

Ihr Problem hier sind nicht die Leerzeichen, sondern eine schließende Klammer. Sie führen wahrscheinlich ein 64-Bit-System aus, in dem das Programmverzeichnis für 32-Bit-Anwendungen Program Files (x86) ist. In einem geklammerten Block in einer Stapeldatei endet die schließende Klammer den Block, sodass der Rest der Zeile einen Syntaxfehler verursacht. Setzen Sie

1) das komplette set Argument in Anführungszeichen:

Sie haben zwei Möglichkeiten, dies zu beheben. Dies bewirkt, dass die Schließung paren nicht als Ende des Blocks erkannt werden:

if defined _OLD_VIRTUAL_PATH (
    set "PATH=%_OLD_VIRTUAL_PATH%" 
) 

2) Sie einen Block nicht verwenden:

if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% 
+0

Wow - ich habe heute 2 Dinge gelernt ... Ich war mir sicher, dass diese Syntax in die Luft gehen würde, aber tatsächlich funktioniert es. Ich bin mir jedoch nicht sicher, warum es für Evgeny benötigt wird - das Setzen eines PATH mit Leerzeichen war für mich nie ein Problem, ohne Zitate zu verwenden. Vielleicht hat Evgenys '_OLD_VIRTUAL_PATH' ein anderes Sonderzeichen (außer einem Leerzeichen), das zitiert werden muss? –

+2

@Michael: Es sind nicht die Räume, die das Problem sind. Ich schrieb den Beitrag um (hoffe, dass Chris nichts dagegen hat; er kann bei Bedarf zurückrollen) und erklärte, was falsch ist und warum. – Joey

+0

Danke Johannes, ich habe den Grund vergessen, aber das ergibt durchaus Sinn. –

0

Nun - ich wusste nie über die defined Betrieb in cmd-Skripten, bis gerade jetzt ...

Ihr Skript scheint mir gut zu funktionieren - welche Linie genau den Fehler produziert?

Sie können auch versuchen:

if not "%_OLD_VIRTUAL_PATH%" == "" (
    set PATH=%_OLD_VIRTUAL_PATH% 
) 

Und glauben Sie mir, ob Sie unter Windows cmd scripting kommen erwar es etwas zu sein wie das, was Sie in der Bash haben, wird Ihr Kopf in den Schmerz sehr viel, sehr bald. Vielleicht möchten Sie sich mit einer anderen Skriptsprache (PowerShell, Python, PERL - alles) beschäftigen, wenn CMD-Scripting keine absolute Voraussetzung ist. Die größte Sache (vielleicht die einzige Sache), die cmd scripting dafür hat, ist, dass es bereits auf jeder Windows-Box installiert ist.

+0

Es gibt eine „definiert“ Operator in die Befehlserweiterungen -, dass die Leitungsarbeiten OK. Es ist die 'set'-Linie, die fehlschlägt. – EMP

+0

der Set-Befehl funktioniert gut für mich, auch mit Leerzeichen in '_OLD_VIRTUAL_PATH'. Was ist '_OLD_VIRTUAL_PATH' genau eingestellt? Ist Ihr Skript genau so formatiert, wie Sie es in der Frage haben (cmd.exe kann sehr wählerisch in der Syntax sein und nicht immer auf eine intuitive Weise). –

Verwandte Themen