检查环境变量是否定义为不带命令扩展且不使用批处理文件?

问题描述 投票:0回答:5

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

我尝试了以下方法,它在 .bat 文件中效果很好,但在命令行上直接键入时失败:

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

当该行位于 .bat 文件中并执行时,我看到

yes
作为输出。当我在命令行中输入它时,输出为空。我正在 Windows XP SP3 上对此进行测试,尽管我的同事在 Windows 7 上看到了相同的结果。我不想使用
IF DEFINED UNDEFINED (echo yes)
,因为如果禁用命令扩展,这将不起作用。这种方法的来源: Microsoft KB 121170 (备用)https://www.robvanderwoude.com/battech_define.php

以下帖子中得票最高的答案让我相信这个问题与“CmdLineParser”与“BatchLineParser”中百分比扩展的处理方式不同有关,但仍然没有让我找到解决方案:

Windows 命令解释器(CMD.EXE)如何解析脚本?

windows batch-file cmd
5个回答
34
投票

呃……只是:

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

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


10
投票

如果扩展程序真的被禁用(我简直不敢相信),
那么你可以尝试不同的方法。

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

这就像

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

更好的方法是使用

IF defined
,但是当扩展被禁用时,您需要先启用它们。

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

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


8
投票

好吧,这花了一点时间,但我想我已经弄清楚了。试试这个:

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

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


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

它回来了:

"PATH" exists
"PATHX" does not exist

1
投票
IF NOT %CODE%==? do stuff.

这适用于 W98 命令行和批处理文件,因此它应该适用于从早期 MS-DOS 开始的任何地方,无需扩展。它假设 CODE 已有效设置或根本未设置。

如果 CODE 不存在,则会导致语法错误;如果 CODE 是问号(选择它是因为它永远不可能存在于路径中),则不会执行任何操作。不管怎样,什么也没有做。 NOT 确保仅当 CODE 似乎设置为有用的内容时才采取操作。

我在编译器批处理文件中使用它来确定是使用相对路径还是使用固定基目录(如果在 CODE 变量中设置了)。它允许我使编码树可移植,而无需修改每个程序的所有批处理文件(如果我移动所有内容)。

© www.soinside.com 2019 - 2024. All rights reserved.