2010-05-05 12 views
5

Ho un problema di script batch di Windows a cui sto sbattendo la testa (nessun gioco di parole). Lo script problematico si presenta così:Come impostare PATH su un altro valore di variabile con spazi nel file batch di Windows

if defined _OLD_VIRTUAL_PATH (
    set PATH=%_OLD_VIRTUAL_PATH% 
) 

quando l'eseguo e _OLD_VIRTUAL_PATH è impostata ottengo:

\Microsoft was unexpected at this time. 

_OLD_VIRTUAL_PATH è una variabile che è stato originariamente impostato da PATH e contiene spazi - Sono sono sicuro che questo è il problema Ma qual è la soluzione? Viene eseguito correttamente se lo racchiudo tra virgolette, ma non penso che l'intero valore della variabile PATH debba essere compreso tra virgolette.

risposta

7

Il tuo problema qui non sono gli spazi ma piuttosto una parentesi chiusa. Probabilmente stai utilizzando un sistema a 64 bit in cui la directory Program Files per le applicazioni a 32 bit è Program Files (x86). In un blocco tra parentesi in un file batch, la parentesi chiusa chiude il blocco, quindi il resto della riga causa un errore di sintassi.

ci sono due modi per risolvere questo problema:

1) Inserire il completo set argomento tra virgolette. Questo fa sì che le parentesi di chiusura per non essere riconosciuti come fine del blocco:

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

2) Non utilizzare un blocco:

if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% 
+0

Wow - Ho imparato 2 cose oggi ... Ero sicuro che questa sintassi sarebbe esplosa, ma sicuramente, funziona. Tuttavia, non sono sicuro del motivo per cui sarebbe necessario per Evgeny: impostare un PERCORSO con spazi non è mai stato un problema per me senza usare le virgolette. Forse "_OLD_VIRTUAL_PATH" di Evgeny ha qualche altro carattere speciale (diverso da uno spazio) che ha bisogno di essere citato? –

+2

@ Michael: Non sono gli spazi il problema. Ho riscritto il post (spero che a Chris non dispiaccia: può tornare indietro se necessario) e ha spiegato cosa è sbagliato e perché. – Joey

+0

Grazie Johannes, avevo dimenticato il motivo, ma questo ha sicuramente un senso. –

0

Bene - Non ho mai conosciuto circa il funzionamento defined negli script cmd fino a poco fa ...

Lo script sembra funzionare bene per me - quale linea esattamente sta producendo l'errore?

Si può anche provare:

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

E credimi, se vieni a Windows cmd scripting mi aspettavo di essere qualcosa di simile a quello che si ha in bash, la tua testa sarà molto dolore, molto presto. Potresti voler utilizzare un altro linguaggio di scripting (PowerShell, Python, PERL - qualsiasi cosa) se lo scripting cmd non è un requisito assoluto. la cosa più grande (forse l'unica cosa) che lo script di cmd sta facendo è che è già installato su ogni box di Windows.

+0

C'è un operatore di "definito" in Estensioni di comando - che le opere di linea OK. È la linea 'set' che fallisce. – EMP

+0

il comando set funziona bene per me, anche con gli spazi in '_OLD_VIRTUAL_PATH'. Cosa è '_OLD_VIRTUAL_PATH' impostato esattamente? Il tuo script è formattato esattamente come lo hai nella domanda (cmd.exe può essere molto schizzinoso sulla sintassi, e non sempre in modo intuitivo). –

Problemi correlati