检查一个环境variables是否没有使用命令扩展并且没有使用batch file?

我需要使用cmd.exe命令行(从gyp构build工具调用cmd.exe)来确定是否定义了环境variables。 我怎样才能做到这一点? 我很好,假设variables值不包含单引号或双引号,但不能假定启用了命令扩展。

我试过了下面这个,它在.bat文件中很好用,但是直接在命令行input时会失败:

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

当确切的行在.bat文件中并执行时,我将yes看作输出。 当我在命令行上input时,输出是空的。 我正在Windows XP SP3上进行testing,尽pipe我的同事在Windows 7上看到了相同的结果。这是http://support.microsoft.com/kb/121170和http://www.robvanderwoude.com/ battech_defined.php 。 我不想使用IF DEFINED UNDEFINED (echo yes)因为如果命令扩展被禁用,那将无法工作。

在接下来的文章中,得票最多的答案让我相信这个问题与“CmdLineParser”与“BatchLineParser”中百分比扩展的处理方式是不同的,但仍然没有使我得到一个解决scheme: Windows命令解释器(CMD.EXE)parsing脚本?

好的,这花了一些,但我想我已经明白了。 尝试这个:

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

这适用于所有情况AFAIK,并不依赖任何命令扩展功能。

错误…只是:

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

我应该补充说,我不相信这需要命令扩展名…

如果扩展名真的被禁用(我不能相信这一点),
那么你可以尝试不同的方式。

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

这工作就好像undefined不存在那么它不被替换,也^undefined但在下一个分析器阶段将删除插入符号,所以%undefined%%undefined%进行比较。 缺点是缺少引号,因为它们也使表达对特殊字符稳定。

更好的方法是使用IF defined ,但是当扩展被禁用时,您需要先启用它们。

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

最好的方法是简单地使用批处理文件,这也应该与gyp构建系统一起使用。

我试过这个,它的工作原理:

 @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 

它返回:

 "PATH" exists "PATHX" does not exist