2013-05-03 13 views
34

Ho bisogno di usare una riga di comando cmd.exe (viene chiamato cmd.exe dallo strumento gyp build) per determinare se una variabile di ambiente è definita o meno. Come posso fare questo? Sto bene assumendo che il valore della variabile non contenga virgolette singole o doppie, ma non può assumere che le estensioni dei comandi siano abilitate.Verificare se una variabile di ambiente è definita senza estensioni di comando e senza utilizzare un file batch?

ho provato la seguente, che funziona alla grande in un file .bat, ma fallisce quando digitate direttamente sulla riga di comando:

IF "%UNDEFINED%" == "" (echo yes) 

Quando quella linea esatta è in un file .bat ed eseguito, Vedo yes come output. Quando lo digito sulla riga di comando, l'output è vuoto. Sto testando questo su Windows XP SP3, anche se il mio collega vede gli stessi risultati su Windows 7. Questo è il metodo suggerito da http://support.microsoft.com/kb/121170 e http://www.robvanderwoude.com/battech_defined.php. Non voglio usare IF DEFINED UNDEFINED (echo yes) perché non funzionerà se le estensioni dei comandi sono disabilitate.

La risposta più votata nel seguente post mi ha portato a credere che questo problema sia legato al modo in cui l'espansione percentuale viene gestita in modo diverso nel "CmdLineParser" rispetto a "BatchLineParser", ma non mi ha ancora portato a una soluzione: How does the Windows Command Interpreter (CMD.EXE) parse scripts?

+1

Alla riga di comando è sufficiente utilizzare il comando 'SET' per verificare se una variabile è definita. – RBarryYoung

+0

Come utilizzarlo in un controllo condizionale? Ho provato: 'IF (SET UNDEFINED) (echo yes)' e ottenuto 'UNDEFINED' era inaspettato in questo momento.' – Johann

+0

Perché dovresti usare l'IF sulla riga di comando? Basta guardarlo e prendere l'azione appropriata. – RBarryYoung

risposta

7

OK, ci sono voluti un po ', ma penso di aver capito. Prova questo:

SET UNDEFINED 2>Nul | Findstr/I "." 
IF ERRORLEVEL 1 ECHO Not Defined. 

Questo funziona per tutti i casi AFAIK e non si basa su alcuna funzione di estensione di comando.

+0

Non funzionerà come scritto in questo contesto, perché l'OP necessita di un comando a riga singola. Immagino che potresti unirti a loro abbastanza facilmente. –

+0

@HarryJohnston Non vedo alcuna menzione di questo requisito da parte dell'OP. Questo soddisfa tutti i requisiti dichiarati dall'OP. – RBarryYoung

+0

La pagina di riferimento del gyp che l'OP collega a non indica alcun metodo per passare un comando a più righe alla shell. –

31

Errr ... basta:

if defined your-var-name ( 
    echo yarp 
) else (
    echo narp 
) 

devo aggiungere, io non credo che questo ha bisogno di estensioni ai comandi ...

+7

'defined' sembra essere un'estensione della riga di comando ... –

+1

Bene , ho imparato qualcosa lì. Grazie. P.S .: vota ++ per la tua risposta. –

4

ho provato questo e ha funzionato:

@echo off 

setlocal disableextensions 

set x=%path% 
if "%x%"=="" (echo "PATH" does not exist) else (echo "PATH" exists) 

set x=%pathx% 
if "%x%"=="" (echo "PATHX" does not exist) else (echo "PATHX" exists) 

endlocal 

tornò:

"PATH" exists 
"PATHX" does not exist 
+0

Ho ottenuto: '' '" PATH "esiste'''' '' "PATHX" esiste'''. Qualche idea sul perché potrebbe essere? – Johann

+0

Quale sistema operativo stai utilizzando? Potresti aggiungere 'set x =' tra le due sezioni solo per essere sicuro che 'x' non è definito prima della 2a istanza ... A meno che tu non abbia una variabile d'ambiente' pathx'! Hai digitato 'set pathx' per vedere? –

+0

L'aggiunta di 'set x =' tra le sezioni non lo ha modificato. Ricevo ancora che "PATH" esiste '' "PATHX" esiste su Windows XP SP3 e due macchine Windows 7 SP1 diverse. – Johann

9

Se le estensioni sono davvero disabilitate (non riesco a credere che questo),
allora si può provare modi diversi.

IF %UNDEFINED% == %^UNDEFINED% (echo yes) 

Questo funziona come se undefined non esiste, allora è non sostituito, anche ^undefined ma il cursore sarà rimossa nella fase successiva parser, così %undefined% viene confrontato %undefined%. Lo svantaggio sono le virgolette mancanti, in quanto rendono l'espressione stabile anche nei confronti di caratteri speciali.

Un modo migliore è utilizzare IF defined, ma quando le estensioni sono disabilitate è necessario prima abilitarle.

cmd /E:on /c "if not defined undefined echo It's undefined" 

Il modo migliore è utilizzare semplicemente un file batch, che dovrebbe funzionare anche con il sistema gyp build

+0

soluzione eccellente ... il migliore per il caso ... ottima idea per forzare un letterale ... THX! – ZEE

Problemi correlati