我需要使用一个cmd.exe的命令行(cmd.exe的正在从GYP构建工具调用),以确定环境变量是否被定义或没有。 我怎样才能做到这一点? 我还好假设变量值不包含单或双引号,但不能假定启用了命令扩展。
我试过以下,这在.bat文件中的伟大工程,但在命令行上直接输入失败:
IF "%UNDEFINED%" == "" (echo yes)
当确切的行是一个.bat文件并执行,我看yes
作为输出。 当我在命令行上输入它,则输出是空的。 我在Windows XP SP3测试这一点,虽然我的同事看到在Windows 7中相同的结果,这是建议的方法http://support.microsoft.com/kb/121170和http://www.robvanderwoude.com/ battech_defined.php 。 我不希望使用IF DEFINED UNDEFINED (echo yes)
,因为如果命令扩展被禁用,将无法正常工作。
在下面的帖子中得票最多的答案使我相信,这个问题涉及到如何百分号展开在“CmdLineParser”不同的处理方式与在“BatchLineParser”,但仍然没有使我的解决方案: 如何并在Windows命令解释器(CMD.EXE)解析脚本?
OK,这花了一点,但我想我已经想通了。 试试这个:
SET UNDEFINED 2>Nul | Findstr/I "."
IF ERRORLEVEL 1 ECHO Not Defined.
这适用于所有情况下AFAIK,并且不依赖于任何命令扩展功能。
Errr ...只是:
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
IF NOT %CODE%==? do stuff.
这适用于W98命令行和在一个批处理文件,所以它应该在任何地方从早期的MS-DOS开始,没有必要的扩展工作。 它假定CODE被有效设置或根本没有设置。
这导致一个语法错误,如果代码不存在,或者什么也不做,如果代码是一个问号(选择,因为它不可能在一个路径存在)。 无论哪种方式,什么也不做。 未使得如果代码出现到被设置为有用的东西肯定行动只取。
我用它在编译器批处理文件,以确定是否使用相对路径或使用固定的基本目录如果一个在CODE可变设定。 它可以让我做一个编码树移植,而不必修改所有的批处理文件的每个程序,如果我移动了一切。
文章来源: Check if an environment variable is defined without command extensions and without using a batch file?