39

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

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

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

当该确切行在 .bat 文件中并执行时,我将yes其视为输出。当我在命令行上键入它时,输出为空。我正在 Windows XP SP3 上对此进行测试,尽管我的同事在 Windows 7 上看到了相同的结果。这是http://support.microsoft.com/kb/121170http://www.robvanderwoude.com/建议的方法battech_defined.php。我不想使用IF DEFINED UNDEFINED (echo yes),因为如果命令扩展被禁用,那将不起作用。

以下帖子中投票最多的答案让我相信这个问题与“CmdLineParser”与“BatchLineParser”中百分比扩展的处理方式不同有关,但仍然没有让我找到解决方案: 如何Windows 命令解释器 (CMD.EXE) 是否解析脚本?

4

5 回答 5

36

错误...只是:

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

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

于 2013-05-03T21:34:21.100 回答
9

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

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

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

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

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

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

于 2013-05-04T11:36:20.533 回答
8

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

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

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

于 2013-05-04T13:45:00.837 回答
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
于 2013-05-03T21:38:37.437 回答
1
IF NOT %CODE%==? do stuff.

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

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

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

于 2018-05-06T16:50:46.517 回答