我需要使用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