Как удалить переменную среды из конфигурации системы с помощью командного файла

Мне нужно удалить системные переменные с клиентских рабочих станций. У меня более 500 клиентов, поэтому я хочу предоставить пользователю командный файл, чтобы он сам запускал удаление системных переменных.


person user73628    schedule 24.09.2009    source источник


Ответы (4)


You may want to make these two permanent with setx but obviously no need to

    C:\>set uvar=HKCU\Environment
    C:\>

    C:\>set mvar=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    C:\>

Немного терминологии
Внутри ключа (который похож на папку) у вас есть переменная с некоторыми данными, например a = 5

http://msdn.microsoft.com/en-us/library/3dwk5axy.aspx говорит о том, что имя (а) имеет значение (5).

Терминология реестра в msdn выглядит немного иначе, но reg.exe и википедия кажутся единообразными. Википедия http://en.wikipedia.org/wiki/Windows_Registry говорит так: «Значения реестра пары имя / данные, хранящиеся в ключах, говорят о паре имя / данные. name (a) data (5) и пара вместе являются значением.

Кажется, что REG использует / v, который, вероятно, относится как к имени переменной, так и к ее данным (как в Википедии), он показывает как имя переменной, так и ее данные. И у REG есть / d, который, я полагаю, предназначен только для данных.

Пример с setx

   C:\>reg query %uvar%
    HKEY_CURRENT_USER\Environment
        TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
        TMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
        ...



C:\>setx aaa 3

C:\>reg query %uvar%

HKEY_CURRENT_USER\Environment
    TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    TMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    ...
    aaa    REG_SZ    3

Если вы попытаетесь использовать setx для его удаления, самое близкое, что вы можете получить, - это очистить его, так как эта статья MS KB это В статье 195050 MS KB говорится, что это оставляет вас в реестре.

setx не удаляет переменную из реестра

C:\>setx aaa ""

SUCCESS: Specified value was saved.

C:\>reg query %uvar%

HKEY_CURRENT_USER\Environment
    TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    TMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    ...
    aaa    REG_SZ


C:\>

Однако стоит отметить, что переменная отсутствует в командной строке. echo% aaa% отобразит% aaa%, поэтому переменная исчезла. В реестре сейчас просто ненужный хлам.

Пользователь отмечает интересное замечание, что теперь, когда вы пытаетесь установить общесистемную переменную, это не работает. поскольку он перезаписывается тем, что находится в пользовательской переменной, в этом случае он всегда будет иметь значение undefined.

C:\>reg delete %uvar% /v aaa
Delete the registry value aaa (Yes/No)? y
The operation completed successfully.

C:\>

Обратите внимание, что aaa теперь нет. Ниже.

C:\>reg query %uvar%

HKEY_CURRENT_USER\Environment
    TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    TMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    ...


C:\>

Если вы хотите сделать это для переменной среды системы / компьютера, а не для переменной пользователя.

-строки ниже должны быть из командной строки с привилегиями администратора.
-заметим, что ключ - HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment.
-The% mvar% (в отличие от% uvar%) нуждается в кавычках вокруг него Потому что в ключе есть пробел. Если вы пропустите кавычки, ничего страшного, вы просто получите сообщение об ошибке, которое может напомнить вам использовать кавычки.
-И, конечно, если вы хотите установить переменную среды в этой части реестра с помощью setx, используйте, например, setx aaa 5 -m то есть -m после.

C:\>set mvar=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

C:\>reg delete "%mvar%" /v aaa
Delete the registry value aaa (Yes/No)? y
The operation completed successfully.

C:\>

дальнейшее примечание
Вы можете создать переменную среды только с помощью REG ADD или REG DELETE .. (вместо setx), но в любом случае при установке переменной вы можете использовать set тоже, так что он устанавливается для текущего сеанса, а не только для следующего. И ссылка re setx https://superuser.com/questions/647505/set-enviroment-variable-setx

person barlop    schedule 19.09.2013

Команда setx с пустым строковым значением не удаляет его. И это не просто придирки, потому что логика совсем другая. Потому что, если пользовательская переменная переопределяет глобальную переменную, то невозможно удалить пользовательскую переменную и заставить глобальную переменную снова «стать активной». Пользовательская переменная с пустой строкой блокирует глобальную переменную. Для этого нужно фактически УДАЛИТЬ его (используя окно переменных среды).

Я только сегодня попробовал это, когда глобальная переменная JAVA_HOME была переопределена конкретным пользователем JAVA_HOME. Невозможно было снова сделать глобальную переменную активной без полного удаления пользовательской переменной. И до сих пор я не видел способа сделать это из командной строки или пакетного сценария.

(Недостаточно очков репутации, чтобы добавить комментарий к приведенному выше ответу о setx, поэтому мне нужно добавить свой собственный ответ ...)

person user1921254    schedule 03.07.2013

Вам нужно будет изменить этот раздел реестра:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment

Изменения вступают в силу после перезагрузки.

person Eric J.    schedule 24.09.2009
comment
Я нашел свой параметр среды setx в \ HKEY_CURRENT_USER \ Environment \. Но спасибо за указатель, где искать в реестре. И, как ни странно, мне не потребовалась перезагрузка, чтобы она повлияла на следующий открываемый мной dos \ cmd. Интересно. - person PHenry; 06.11.2017

Если вы хотите избежать перезагрузки, вы должны найти способ транслировать WM_SETTINGSCHANGE в каждое активное окно после удаления значения.

Это заставит новые окна CMD заметить, что переменная была удалена (и любая другая программа, которая понимает WM_SETTNGSCHANGE).

person Dan P.    schedule 28.03.2017