2013-05-03 18 views
34

Bir ortam değişkeninin tanımlanıp tanımlanmadığını belirlemek için bir cmd.exe komut satırı kullanmam gerekiyor (cmd.exe gyp derleme aracından çağrılıyor). Bunu nasıl yapabilirim? Değişken değerinin tek veya çift tırnak içermediğini, ancak komut uzantılarının etkinleştirildiğini varsayamam. ,Bir ortam değişkeni komut uzantıları olmadan ve bir toplu iş dosyası kullanmadan tanımlanmış mı kontrol edin?

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

o tam çizgi bir .bat dosyası ve idam içinde:

bir .bat dosyası inşaat büyük aşağıdakileri, denedim ama doğrudan komut satırına yazdığınız başarısız olduğunda Çıktı olarak yes'u görüyorum. Komut satırına yazdığımda çıktı boş. Windows XP SP3'te bunu test ediyorum, ancak iş arkadaşım Windows 7'de de aynı sonuçları görüyor. Bu, http://support.microsoft.com/kb/121170 ve http://www.robvanderwoude.com/battech_defined.php tarafından önerilen yöntemdir. Ben IF DEFINED UNDEFINED (echo yes) kullanmak istemiyorum, çünkü bu komut uzantıları devre dışı bırakıldı.

Aşağıdaki gönderide en çok okunan yanıt, bu sorunun, "CmdLineParser" ve "BatchLineParser" yazılımında yüzde-genişlemenin farklı şekilde nasıl ele alındığına bağlı olduğuna inanmamı sağladı, ancak yine de bir çözüm: How does the Windows Command Interpreter (CMD.EXE) parse scripts?

+1

Komut satırında, bir değişkenin tanımlanıp tanımlanmadığını kontrol etmek için 'SET' komutunu kullanabilirsiniz. – RBarryYoung

+0

Bunu koşullu bir kontrolde nasıl kullanırım? Denedim: “Eğer (UNDEFINED) (yankı evet)” (yankı evet) ve “UNDEFINED” bu sefer beklenmedikti.' – Johann

+0

Neden IF'yi komut satırında kullanmanız gerekiyor? Sadece ona bak ve uygun eylemi yap. – RBarryYoung

cevap

7

Tamam, bu biraz zaman aldı, ama sanırım bunu çözdüm. Bu deneyin:

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

Bu AFAIK her durumda çalışır ve herhangi bir komut uzatma özellikleri dayanmaz.

+0

Bu bağlamda yazılmış olarak çalışmaz, çünkü OP'nin tek satırlı bir komut gerektirmesi gerekir. Onlara yeterince kolay katılabileceğini hayal ediyorum. –

+0

@HarryJohnston OP tarafından bu gereklilikten bahsetmiyorum. Bu OP'nin belirtilen gereksinimlerini karşılar. – RBarryYoung

+0

OP bağlantılarının bulunduğu referans sayfası, çok satırlı komutları kabuğa geçirecek herhangi bir yöntem belirtmez. –

31

Errr ... sadece:

if defined your-var-name ( 
    echo yarp 
) else (
    echo narp 
) 
Ben bu komut uzantıları ihtiyacı inanmıyoruz, eklemek gerekir

...

+7

"tanımlı 'bir komut satırı uzantısı gibi görünüyor ... –

+1

Well Orada bir şeyler öğrendim. Teşekkürler. P.S .: cevabınız için ++ oyu. –

4

Bu çalıştı ve işe yaradı:

@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 
Bu döndürdü: uzantıları gerçekten devre dışı ise

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

Elimde: '' 'PATH '' var' '' '' '' PATHX '' var '' '. Bunun neden olabileceği hakkında bir fikrin var mı? – Johann

+0

Hangi İşletim Sistemini kullanıyorsunuz? İki bölüm arasında 'x 'ifadesini' x' un 2. sınıftan önce undefined olduğundan emin olmak için' setx = 'ekleyebilirsiniz ... Eğer bir 'pathx' ortam değişkeni yoksa! Görmek için 'set pathx' yazdınız mı? –

+0

"set x =" ifadesi eklendiğinde bölümler değişmedi. Hala Windows XP SP3'te "PATH" mevcut "PATHX" var ve iki farklı Windows 7 SP1 makinesini kullanıyorum. – Johann

9

(Ben bu inanamıyorum),
o zaman farklı yollar deneyebilirsiniz.

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

Bu yüzden %undefined%%undefined% karşılaştırılır, o zaman ^undefined da değiştirilmemiştir Varlığından yok ama şapka sonraki ayrıştırıcı aşamasında silinecektir undefined sanki çalışır. Dezavantaj, özel karakterlere karşı ifadeyi kararlı hale getirdikleri için kayıp tırnaklardır.

IF defined'u kullanmanın daha iyi bir yolu, ancak uzantılar devre dışı bırakıldığında, önce bunları etkinleştirmeniz gerekir.

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

iyi yolu da gyp inşa sistemi ile çalışması gerekir bir toplu iş dosyası, kullanmaktır.

+0

mükemmel çözüm ... dava için en iyi ... bir edebi zorlamak için harika bir fikir ... THX! – ZEE

İlgili konular