为什么这个变量显示为未定义?

时间:2009-11-12 09:13:50

标签: batch-file map drive

我有这段代码:

FOR %%d IN (c d e f g h i j k l m n o p q r s t u v w x y z) do (
        IF NOT EXIST %%d:\ (
            echo Free drive %%d
            set D=%%d:
        )
)

echo d=%D%
echo Using %D% to map remote drive
subst %D% /d
subst %D% \\path_to_drive

之后我使用D变量来映射一个免费的驱动器。问题是,当我第一次运行它并尝试映射驱动器时,脚本认为D变量是未定义的,或者什么都不包含。如果我在脚本结束时打印它的值,使用:

set D

我发现它找到了一个驱动器,它有它的价值。当我第二次运行脚本时,它将按预期工作。它让我疯狂,批处理认为变量未定义,并且在脚本完成它的执行后它有一个值。我还想补充说,这是使用D变量的唯一部分,并且ALWAYS至少有一个免费驱动器,因此,没有可用驱动器的事实是是的。

编辑:我添加了用于映射驱动器的行。

2 个答案:

答案 0 :(得分:2)

根据 where 确切地使用环境变量,这可能会发生。请记住,cmd会在命令的解析状态下扩展环境变量。任何带括号框的命令本身都是一个大的命令。所以你上面发布的是一个命令,当cmd 读取时,会立即展开任何环境变量,而不是在执行它时。

为了避免这种情况,请尝试添加

setlocal enabledelayedexpansion enableextensions

位于批处理文件的顶部,并使用!D!代替%D%的环境变量。

答案 1 :(得分:1)

这对我有用,你能看到它在你的设置上是否适合你,你能告诉我们你如何引用D?

FOR %%d IN (c d e f g h i j k l m n o p q r s t u v w x y z) do (
        IF NOT EXIST %%d:\ (
                echo Free drive %%d
                set D=%%d:
        )
)
echo %D%