Переменные среды пользователя и системы: переопределяют ли системные переменные переменные пользователя?

21

У меня повышенные права на ноутбук, но нет прав администратора. Права администратора необходимы для изменения системных переменных среды. Я ожидал, что если бы я создал переменную среды пользователя с тем же именем, что и системная переменная среды, переменная пользователя переопределит системную переменную, но это не так.

После добавления пользовательской переменной с тем же именем, что и системная переменная, я открыл новое окно cmd и использовал команду echo для отображения переменной. Он показал мне значение системной переменной вместо значения пользовательской переменной.

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

У меня Windows 7.

Чад
источник
При изменении переменных вам часто приходится полностью перезагружать Windows. Изменение переменной в настройках не изменит запущенных процессов. Новые процессы копируют среду из запущенных процессов (в зависимости от того, как они запускаются), поэтому простой запуск процесса не означает, что вы получите новую среду.
Zoredache
Я перезагружался и все еще, когда я запускаю «echo% path%» из окна cmd.exe, он отображает мою системную переменную env, а не значение пользовательской переменной. Итак, я удалил переменную User, o доступ администратора, изменил переменную System path и сделал то же самое echo cmd. Обновленное значение env отображалось без перезагрузки. Это говорит мне о том, что переменные USER не отменяют системные переменные и перезагрузка не требуется. Neitehr это то, что я ожидал.
Чад
Какая процедура используется для добавления пользовательской переменной с тем же именем, что и системная переменная ? Что то типа ?
JosefZ
JosefZ: да, я добавил две переменные среды: одну ПОЛЬЗОВАТЕЛЬСКУЮ, а другую СИСТЕМУ, обе с одним и тем же именем, используя графический интерфейс Windows 7, аналогично экранам, показанным в вашей ссылке.
Чад
@ Чед Разве ответ, который вы приняли ниже, не является полной противоположностью вашего опыта? Как вы объясните несоответствие?
RockPaperLizard

Ответы:

25

Согласно статье MSKB переменные среды в Windows NT :

Переменные среды пользователя .... имеют приоритет над системными переменными среды.

Одним заметным исключением является PATHпеременная, которая является комбинированным результатом системных и пользовательских переменных:

Путь строится из системного пути, который можно просмотреть в поле «Переменные среды системы» в диалоговом окне «Система». Путь пользователя добавляется к системному пути.

В статье также рассматривается одинаковые исключениями для разложения LibPathи Os2LibPathпеременных, а также , как те , которые указан в autoexec.batобрабатывается. Эти пункты, вероятно, не будут иметь большого значения в сегодняшних типичных условиях.

Кредит на этот так ответ

Я говорю Восстановить Монику
источник
2
Можно ли сделать Путь пользователя, предшествующий системному пути?
Qwerty
3

Все, что Twisty Impersonator сказал в своем ответе , верно. Мысль о том, что переменная пути пользователя добавлена, была выделена, и я считаю, что последствия этого различия требуют некоторого дополнительного подхода.

Путь =% Путь% (Система); % Path% (Пользователь)

Когда вы выполняете исполняемую программу (или любой исполняемый скрипт, такой как .bat, .vbsи т. Д.), Вам не нужно указывать полный путь.

Например, чтобы запустить java, вы можете ввести любой из них:

C:/Program Files (x86)/Java/jre6/bin/java -version

java.exe -version

java -version

Первый пример использует полный путь. Это всегда будет использовать версию Java по этому точному пути.

Второй пример будет проходить через все каталоги в %Path%переменной среды в поисках исполняемого файла с именем java.exe. Он запустит самый первый найденный файл и прекратит поиск. Если есть два файла с именем java.exeгде - то на %Path%, используется только первый из найденных.

Третий пример, как и второй, будет перебирать каталоги, перечисленные в %Path%. Кроме того, поскольку расширение файла не было предоставлено, список исполняемых расширений файлов добавляется к имени файла в порядке, указанном в %PATHEXT%переменной среды. Если есть несколько файлов с именем java.com, java.exe, java.batи т.д. где - то на %Path%, используется только первый из найденных.

Вы можете просмотреть список расширений исполняемых путей в вашей системе, создав следующий пакетный файл:

@echo off
echo %PATHEXT%
pause

На моей машине это:

.COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .wsf; .wsh; .msc; .py

Что все это значит?

В отличие от других переменных среды, пользовательский путь не позволяет переопределить системный путь. Точно противоположный случай. Из приведенных выше примеров, есть много случаев, когда вы можете изменить версию Java по умолчанию. Однако, если в системном пути уже указана версия Java, именно эта версия ВСЕГДА будет найдена первой, поскольку путь ищется по порядку слева направо, а путь пользователя добавляется справа. со стороны, с системным путем слева.

Что я могу с этим поделать?

Если у вас нет доступа к системным переменным среды, вы не можете переопределить программы по умолчанию в системном пути, используя путь пользователя. (Фактически, это должно быть так, иначе определенные программы перестанут работать правильно, и это откроет вашу систему для вмешательства вредоносного программного обеспечения. Никто не хочет этого.)

Вместо этого вы должны использовать полный путь, если вам нужна конкретная версия.

JonathanDavidArndt
источник
1
Можно ли сделать Путь пользователя, предшествующий системному пути?
Qwerty
1
Это было бы хорошей темой для другого вопроса. (Быстрый поиск на этом сайте не выявил ничего актуального.) Пожалуйста, не стесняйтесь задавать новый вопрос и размещать ссылку на него здесь, в комментариях!
Джонатан