2013-05-03 8 views
34

Potrzebuję użyć wiersza polecenia cmd.exe (program cmd.exe jest wywoływany z narzędzia budowania gyp), aby określić, czy zdefiniowano zmienną środowiskową. Jak mogę to zrobić? Jestem w porządku, zakładając, że wartość zmiennej nie zawiera pojedynczych ani podwójnych cudzysłowów, ale nie można założyć, że rozszerzenia poleceń są włączone.Sprawdź, czy zmienna środowiskowa jest zdefiniowana bez rozszerzeń poleceń i bez użycia pliku wsadowego?

Próbowałem następujące, które działa świetnie w pliku .bat, ale nie bezpośrednio po wpisaniu w wierszu polecenia:

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

Kiedy tak dokładna linia jest w pliku .bat i wykonane, Widzę yes jako wynik. Kiedy wpisuję go w linii poleceń, dane wyjściowe są puste. Testuję to w systemie Windows XP SP3, chociaż mój współpracownik widzi te same wyniki w systemie Windows 7. Jest to metoda sugerowana przez http://support.microsoft.com/kb/121170 i http://www.robvanderwoude.com/battech_defined.php. Nie chcę używać IF DEFINED UNDEFINED (echo yes), ponieważ nie zadziała, jeśli rozszerzenia poleceń są wyłączone.

Najwyżej głosowana odpowiedź w następującym poście doprowadziła mnie do przekonania, że ​​ta kwestia wiąże się z tym, że obsługa procentowa jest obsługiwana inaczej w "CmdLineParser" niż "BatchLineParser", ale wciąż nie doprowadziła mnie do rozwiązanie: How does the Windows Command Interpreter (CMD.EXE) parse scripts?

+1

W linii poleceń można po prostu użyć polecenia 'SET', aby sprawdzić, czy zmienna jest zdefiniowana. – RBarryYoung

+0

Jak tego użyć w kontroli warunkowej? Próbowałem: 'IF (SET UNDEFINED) (echo yes)' i otrzymałem 'UNDEFINED 'było nieoczekiwane w tym momencie.' – Johann

+0

Po co używać IF w linii poleceń? Po prostu spójrz na to i podejmij stosowną akcję. – RBarryYoung

Odpowiedz

7

OK, zajęło to trochę, ale myślę, że to wymyśliłem. Wypróbuj to:

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

Działa to we wszystkich przypadkach AFAIK i nie polega na żadnych funkcjach rozszerzenia poleceń.

+0

Nie będzie działać tak, jak napisano w tym kontekście, ponieważ OP potrzebuje komendy jednoliniowej. Wyobrażam sobie, że możesz łatwo dołączyć do nich. –

+0

@HarryJohnston Nie widzę żadnej wzmianki o tym wymogu przez PO. Spełnia to wszystkie podane wymagania PO. – RBarryYoung

+0

Strona odniesienia gyp, do której prowadzą łącza OP, nie wskazuje żadnej metody przekazania komendy wieloliniowej do powłoki. –

31

Eeee ... po prostu:

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

dodam, nie wierzę, to wymaga rozszerzenia poleceń ...

+7

'Zdefiniowany' wydaje się być rozszerzeniem linii poleceń ... –

+1

Cóż , tam się czegoś nauczyłem. Dzięki. P.S .: głosuj ++ za odpowiedź. –

4

próbowałem to i to działało:

@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 

powrócił:

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

Mam: '' '" PATH "istnieje'''' '' "PATHX" istnieje'''. Jakiś pomysł, dlaczego tak się dzieje? – Johann

+0

Z jakiego systemu operacyjnego korzystasz? Możesz dodać 'set x =' pomiędzy dwiema sekcjami, aby upewnić się, że 'x' jest niezdefiniowane przed drugą instancją ... Chyba że masz zmienną środowiskową' pathx'! Czy wpisałeś 'set pathx', aby zobaczyć? –

+0

Dodanie 'set x =' między sekcjami go nie zmieniło. Nadal mam '' PATH "istnieje'' "PATHX" istnieje "zarówno na Windows XP SP3, jak i na dwóch różnych maszynach z Windows 7 SP1. – Johann

9

Jeśli rozszerzenia są naprawdę wyłączona (nie mogę w to uwierzyć),
następnie można wypróbować różne sposoby.

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

Działa to tak, jakby undefined nie istnieje, to nie jest wymienione, ale również ^undefined daszek zostaną usunięte w następnej fazie parsera, więc %undefined% jest porównywana %undefined%. Wadą są brakujące cytaty, ponieważ sprawiają one, że wyrażenie jest stabilne w stosunku do znaków specjalnych.

Lepszym sposobem jest użycie IF defined, ale gdy rozszerzenia są wyłączone, musisz je najpierw włączyć.

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

Najlepszym sposobem jest po prostu użycie pliku wsadowego, który powinien również działać z systemem kompilacji gyp.

+0

doskonałe rozwiązanie ... najlepsze dla sprawy ... świetny pomysł na wymuszenie dosłowności ... THX! – ZEE