Почему эта переменная выглядит как неопределенная? - PullRequest
0 голосов
/ 12 ноября 2009

У меня есть этот код:

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 ]

2 голосов
/ 12 ноября 2009

В зависимости от , где , именно вы используете переменную окружения, это может произойти. Имейте в виду, что cmd расширяет переменные окружения в состоянии анализа команды. И любая команда, имеющая блок в скобках, сама по себе является одной большой командой. То, что вы опубликовали выше, - это одна команда, и любые переменные окружения раскрываются сразу, когда cmd читает , а не когда выполняется.

Чтобы обойти это, попробуйте поставить

setlocal enabledelayedexpansion enableextensions

вверху командного файла и используйте переменную окружения с !D! вместо %D%.

1 голос
/ 12 ноября 2009

Это работает для меня, можете ли вы увидеть, работает ли оно для вас на вашей установке, вы также можете показать нам, как вы ссылаетесь на 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%
...