检查是否定义了没有命令扩展且没有使用批处理文件的环境变量?

Joh*_*ann 37 windows cmd batch-file

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

我尝试了以下内容,它在.bat文件中运行良好,但在命令行上直接输入时失败:

IF "%UNDEFINED%" == "" (echo yes)
Run Code Online (Sandbox Code Playgroud)

当该确切行在.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)解析脚本吗?

Sim*_*lin 33

呃...只是:

if defined your-var-name ( 
    echo yarp
) else (
    echo narp
)
Run Code Online (Sandbox Code Playgroud)

我应该补充一点,我不相信这需要命令扩展......


jeb*_*jeb 9

如果扩展名真的被禁用(我不敢相信),
那么你可以尝试不同的方式.

IF %UNDEFINED% == %^UNDEFINED% (echo yes)
Run Code Online (Sandbox Code Playgroud)

这样就好像undefined不存在然后它不被替换,^undefined但是插入符号将在下一个解析器阶段被删除,因此%undefined%被比较%undefined%.缺点是缺少引号,因为它们也使表达式对特殊字符稳定.

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

cmd /E:on /c "if not defined undefined echo It's undefined"
Run Code Online (Sandbox Code Playgroud)

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


RBa*_*ung 7

好吧,这需要一点点,但我想我已经弄明白了.试试这个:

SET UNDEFINED 2>Nul | Findstr/I "."
IF ERRORLEVEL 1  ECHO Not Defined.
Run Code Online (Sandbox Code Playgroud)

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


Jam*_* L. 5

我试过这个并且它有效:

@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
Run Code Online (Sandbox Code Playgroud)

它返回:

"PATH" exists
"PATHX" does not exist
Run Code Online (Sandbox Code Playgroud)