powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Windows [игнор отключен] [закрыт для гостей] / bat-ник для изменения переменной окружения
6 сообщений из 6, страница 1 из 1
bat-ник для изменения переменной окружения
    #34933964
simulator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для практических нужд хочу написать bat-ник, который добавит мне в переменную окружения CLASSPATH jar'ы от axis'а.

То есть, грубо говоря, хочу сконкатенировать CLASSPATH с некоторыми строками. Для этого создал такой скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@echo off

setlocal enabledelayedexpansion

for /f "tokens=* usebackq" %%i in (`dir /B %AXIS2_HOME%\lib\*.jar`) do (
 set CLASSPATH=%AXIS2_HOME%\lib\%%i;!CLASSPATH!
)


@echo Done!

exit /b  0 

Однако, после исполнения скипта вывод
Код: plaintext
echo %CLASSPATH%
возвращает то же самое, что и раньше.
Сначала я предположил, что скрипт неправильно присваивает CLASSPATH в цикле. Для проверки перед @exit /b 0 вставил вывод этой переменной - все ОК. Она содержит то, что надо.
То есть как только скрит завершается, значение переменной возвращается в прежнее состояние.
Или другое предположение - значение %CLASSPATH% прочитано при открытии окна консоли и дальше уже не меняется.

Но оба эти объяснения не вяжутся с тем, что другой bat-ник работает как надо:
Код: plaintext
1.
set PATH=%PATH%;C:\MinGW\bin

То есть после его исполнения к переменной PATH добавляется еще и строка ";C:\MinGW\bin".
Вобщем, я в замешательстве. Как исправить мой bat-ник, чтобы он корректно устанавливал CLASSPATH? (если таковое возможно)
...
Рейтинг: 0 / 0
bat-ник для изменения переменной окружения
    #34933999
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каждый скрипт получает свою ВРЕМЕННУЮ копию переменных окружения. По завершению скрипта эта копия удаляется из памяти. Анализируй это.
...
Рейтинг: 0 / 0
bat-ник для изменения переменной окружения
    #34934002
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и SET /? надо бы читать... а то пишет MS пишет... а чукчи не читают.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
...
Связывание времени выполнения для переменных среды окружения полезно при обходе
Ограничений раннего связывания, которое происходит при первом чтении текстовой
строки, а не при ее выполнении. Следующий пример демонстрирует возникающую
проблему при использовании раннего связывания переменных:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after;
        if "%VAR%" == "after" @echo Тело внутреннего оператора сравнения
    )

Данное сообщение не буде выводиться, т.к. %VAR% в ОБОИХ выражениях IF
подставляется в момент первого использования в первом IF, в том числе и в тело
первого ветвления IF, которое является составным выражением. В IF внутри
составного выражения в действительности сравниваются значения "before" и
"after", что заведомо ложно. Следующий пример подобной ошибки:

    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

в котором никогда не будет построен список файлов текущей директории. Вместо
этого, значением переменной LIST будет имя последнего найденного файла.
И вновь, это случилось потому, что %LIST% подставляется всего один раз -
в момент обработки выражения FOR, когда список еще пуст.
Фактически приведенный фрагмент эквивалентен следующему:

    for %i in (*) do set LIST= %i

который сохраняет имя последнего найденного файла в переменной LIST.

Связывание времени выполнения для переменных среды окружения происходит при
использовании специального символа (восклицательного знака), обозначающего
проведение сопоставления во время выполнения. Если включена поддержка связывания
времени выполнения, то для достижения ожидаемых результатов приведенные выше
фрагменты должны быть переписаны следующим образом:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo Тело внутреннего оператора сравнения
    )

    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%

При включенной расширенной обработке команд доступны несколько переменных
среды, которые не отображаются в списке, отображаемом при вызове команды SET.
Значения этих переменных вычисляются динамически каждый раз при их извлечении.
...
Рейтинг: 0 / 0
bat-ник для изменения переменной окружения
    #34934005
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2Каждый скрипт получает свою ВРЕМЕННУЮ копию переменных окружения. По завершению скрипта эта копия удаляется из памяти. Анализируй это.

Поправка: "Каждый скрипт" следует читать "Каждый экземпляр задачи CMD.exe".
...
Рейтинг: 0 / 0
bat-ник для изменения переменной окружения
    #34936588
simulator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks2 aleks2Каждый скрипт получает свою ВРЕМЕННУЮ копию переменных окружения. По завершению скрипта эта копия удаляется из памяти. Анализируй это.

Поправка: "Каждый скрипт" следует читать "Каждый экземпляр задачи CMD.exe".

Тогда я не понимаю, почему вот этот скрипт работает правильно:
Код: plaintext
1.
set PATH=%PATH%;C:\MinGW\bin
После его завершения значение PATH меняется.
...
Рейтинг: 0 / 0
bat-ник для изменения переменной окружения
    #34965548
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут же по русски написано, а? Ну прочитай...

Ну и SET /? надо бы читать... а то пишет MS пишет... а чукчи не читают.

...Связывание времени выполнения для переменных среды окружения полезно при обходеОграничений раннего связывания, которое происходит при первом чтении текстовойстроки, а не при ее выполнении. Следующий пример демонстрирует возникающуюпроблему при использовании раннего связывания переменных: set VAR=before if "%VAR%" == "before" ( set VAR=after; if "%VAR%" == "after" @echo Тело внутреннего оператора сравнения )Данное сообщение не буде выводиться, т.к. %VAR% в ОБОИХ выражениях IFподставляется в момент первого использования в первом IF, в том числе и в телопервого ветвления IF, которое является составным выражением. В IF внутрисоставного выражения в действительности сравниваются значения "before" и"after", что заведомо ложно. Следующий пример подобной ошибки: set LIST= for %i in (*) do set LIST=%LIST% %i echo %LIST%в котором никогда не будет построен список файлов текущей директории. Вместоэтого, значением переменной LIST будет имя последнего найденного файла.И вновь, это случилось потому, что %LIST% подставляется всего один раз -в момент обработки выражения FOR, когда список еще пуст.Фактически приведенный фрагмент эквивалентен следующему: for %i in (*) do set LIST= %iкоторый сохраняет имя последнего найденного файла в переменной LIST.Связывание времени выполнения для переменных среды окружения происходит прииспользовании специального символа (восклицательного знака), обозначающегопроведение сопоставления во время выполнения. Если включена поддержка связываниявремени выполнения, то для достижения ожидаемых результатов приведенные вышефрагменты должны быть переписаны следующим образом: set VAR=before if "%VAR%" == "before" ( set VAR=after if "!VAR!" == "after" @echo Тело внутреннего оператора сравнения ) set LIST= for %i in (*) do set LIST=!LIST! %i echo %LIST%При включенной расширенной обработке команд доступны несколько переменныхсреды, которые не отображаются в списке, отображаемом при вызове команды SET.Значения этих переменных вычисляются динамически каждый раз при их извлечении.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Windows [игнор отключен] [закрыт для гостей] / bat-ник для изменения переменной окружения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]