Почему моя командная строка Windows 8 не обновляет свой путь

21

Мне нужно было добавить новую запись в мою переменную PATH. Это обычное занятие для меня в моей работе, но я недавно начал использовать Windows 8. Я предполагал, что процесс будет похож на Windows 7, Vista, XP ...

Вот моя последовательность событий:

  1. Откройте Свойства системы (Пуск-> [тип «Панель управления»] -> Панель управления \ Система и безопасность \ Система -> Расширенные настройки системы -> Переменные среды)
  2. Добавить новый путь в начало моей переменной USER PATH (C: \ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. Открыл командную строку (Пуск -> [введите "командная строка" введите] -> [введите "путь" введите]

Мой новый путь не доступен (см. Прикрепленное изображение и видео). Я дублировал тот же процесс на компьютере с Windows 7, и он работал.

Скриншот переменных среды

РЕДАКТИРОВАТЬ

Переменные среды Windows 8 и видео командной строки

РЕДАКТИРОВАТЬ

Это определенно не поведение Windows 7. Посмотрите это видео, чтобы увидеть поведение, которое я ожидаю работать в Windows 7. http://youtu.be/95JXY5X0fII

РЕДАКТИРОВАТЬ 31.05.2013

Итак, после большого разочарования, я написал небольшое приложение на C # для тестирования WM_SETTINGCHANGEсобытия. Этот код получает событие как в Windows 7, так и в Windows 8. Однако в Windows 8 в моей системе я не получаю правильный путь; но я делаю в Windows 7. Это не может быть воспроизведено в других системах Windows 8.

Вот код C #.

using System;
using Microsoft.Win32;

public sealed class App
{
    static void Main()
    {
        SystemEvents.UserPreferenceChanging += new UserPreferenceChangingEventHandler(OnUserPreferenceChanging);

        Console.WriteLine("Waiting for system events.");
        Console.WriteLine("Press <Enter> to exit.");
        Console.ReadLine();
    }

    static void OnUserPreferenceChanging(object sender, UserPreferenceChangingEventArgs e)
    {
        Console.WriteLine("The user preference is changing. Category={0}", e.Category);
        Console.WriteLine("path={0}", System.Environment.GetEnvironmentVariable("PATH"));
    }
}

OnUserPreferenceChanging эквивалентно WM_SETTINGCHANGE

Программа на C #, работающая в Windows 7 (вы можете увидеть, как проходит событие, и он выбирает правильный путь).

Программа на C #, работающая в Windows 8 (вы можете видеть, как проходит событие, но неверный путь).

Есть что-то в моей среде, что ускоряет эту проблему. Однако это ошибка Windows 8?

РЕДАКТИРОВАТЬ 2014-04-28

В связи с этим и рядом других проблем мы больше не используем Windows 8 на рабочем столе. У нас нет среды для продолжения тестирования и экспериментов с этой проблемой. Для нас до сих пор нет ответа или решения этой проблемы. Ответы ниже не решили нашу проблему.

mawcsco
источник
2
Я думаю, что вам нужно перезагрузиться после внесения изменений, чтобы они вступили в силу.
Загадка
@ Enigma Почему? Мне не нужно было перезагружаться в Windows 7, Vista, XP, 2000 ...
mawcsco
@mawcsco Вы сделали в 7 по крайней мере. Открытие командных запросов из меню «Пуск» запускается вместе со средой из оболочки Explorer, которая была загружена при входе в систему. Вам нужно либо убить / перезапустить проводник, либо выйти из системы, либо снова войти в систему, либо перезапустить систему.
Дарт Андроид
1
@ Enigma Перезагрузка не должна быть необходимой. serverfault.com/questions/8855/…
mawcsco
1
Я только что проверил это на Windows 7 и Windows 8: в любом случае новая переменная окружения была видна cmdпри запуске нового экземпляра. Конечно, уже запущенный cmdне получил обновленную среду.
Алексей Иванов

Ответы:

7

Если вы запускаете командную строку из меню «Пуск» или ярлык на панели задач, вы должны либо:

  • Перезагрузка explorer. Убей его и перезапусти.
  • Выйдите из системы и снова войдите в нее (что эффективно перезапускается explorer).
  • Перезапустите систему (которая также эффективно перезапускается explorer).

Среда не обновляется немедленно, потому что среды наследуются от их родительского процесса, за исключением того explorer, что запускается системой при входе в систему. Вот как он ведет себя в моей системе Windows 7.

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

Дарт Андроид
источник
2
Абсолютно неверно для Windows 7. Смотрите видео, которое я привел в своем посте выше.
mawcsco
1
Да. Вы определенно правы, хотя мои изменения не были применены сразу к новым окнам консоли на Win 7 раньше. Я не могу вспомнить, каков был мой рабочий процесс. Когда я вернусь домой, я поиграюсь с моей системой Win 8, если к тому времени никто не ответит.
Дарт Андроид
5
Если вы изменили переменные среды с помощью диалогового окна «Свойства системы», изменения будут применены немедленно к текущему экземпляру Explorer, и все запущенные процессы получат новую среду. Уже запущенные процессы не обновляют свои переменные среды автоматически, если они не обрабатывают WM_SETTINGCHANGEсообщение.
Алексей Иванов
1
Чувак, это помогло мне понять проблему, которая у меня была в любом случае. Я использую AutoHotkey для запуска командной строки, и он не работал, пока я не перезапустил autohotkey!
Мосс
1
@mawcsco Это сработало для меня, я использую Windows 7.
laike9m
3

От: http://support.microsoft.com/kb/104011 через /server//q/8855/158027

...

Тем не менее, обратите внимание, что изменения переменных среды не приводят к немедленному изменению. Например, если вы запустите другую командную строку после внесения изменений, переменные среды будут отражать предыдущие (а не текущие) значения. Изменения не вступят в силу, пока вы не выйдете из системы, а затем снова войдите в систему.

Чтобы внести эти изменения без выхода из системы, передайте сообщение WM_SETTINGCHANGE всем окнам системы, чтобы любые заинтересованные приложения (такие как Windows Explorer, Диспетчер программ, Диспетчер задач, Панель управления и т. Д.) Могли выполнить обновление. БОЛЬШЕ ИНФОРМАЦИИ


Например, в системах на базе Windows NT следующий фрагмент кода должен распространять изменения переменных среды, используемых в командной строке:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    (LPARAM) "Environment", SMTO_ABORTIFHUNG,
    5000, &dwReturnValue);

Ни одно из приложений, поставляемых с Windows 95 и Windows 98, включая Windows Explorer и Program Manager, не отвечает на это сообщение. Таким образом, хотя эта статья технически может быть реализована в Windows 95 и Windows 98, нет никакого эффекта, кроме как уведомлять сторонние приложения. Единственный метод изменения глобальных переменных среды в Windows 95 - это изменение файла autoexec.bat и перезагрузка.

загадка
источник
2
Windows Explorer в Windows 7 обрабатывает это сообщение, и достаточно перезапустить командную строку из панели задач или меню «Пуск».
Алексей Иванов
«Изменения в переменных среды должны вступить в силу немедленно, если вы внесете изменение в главном диалоговом окне« Свойства »для рассматриваемого компьютера (перейдите в« Мой компьютер | Свойства | Дополнительно | Переменные среды »). После сохранения изменений проводник передает сообщение WM_SETTINGCHANGE. ко всем окнам, чтобы сообщить им об изменении. " serverfault.com/questions/8855/…
mawcsco
2
«Системный совет. Эта статья относится к версии Windows, отличной от той, которую вы используете. Содержимое этой статьи может не относиться к вам. Посетите Центр решений Windows 8»
mawcsco
Меня не удивит, что это деталь реализации и что Microsoft не собиралась поддерживать это поведение в Windows 8 или выше.
Surfasb
1

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

Откройте Свойства системы (Пуск-> [тип «Панель управления»] -> Панель управления \ Система и безопасность \ Система -> Расширенные настройки системы -> Переменные среды)

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

Вы должны перейти в учетную запись пользователя -> выбрать текущую учетную запись -> изменить переменные среды

После изменения перезапустите Power Shell. затем

echo $env:JAVA_HOME

или

Get-ChildItem env

Надеюсь, что это поможет вам.

Ву Гия Труонг
источник
Я думаю, что вы, возможно, пропустили детали в моих скриншотах и ​​видео, которое показывает диалог с «Пользовательские переменные для mwillia3». Это мое имя пользователя. Я точно знаю, что редактировал правильные переменные среды. Приложение C # запускает событие со старым значением, а не с обновленным значением. Я сдался. Я вполне уверен, что это ошибка Win 8, и у меня больше нет доступа к Windows 8, чтобы проверить это.
mawcsco
Некоторые люди не всегда читают подробности. Я вижу это в некоторых системах, а не в других, я даже видел это в Windows 7/2008. Там нет рифмы или причины, когда это случилось, что я нашел.
ferventcoder
Та же проблема с Windows Server 2012 r2 даже после распространения WM_SETTINGSCHANGED. Я считаю, что это ошибка Windows.
Везенков
0

Попробуйте SETX вместо SET. НапримерSETX PATH "%PATH%;MyPath"

KCT
источник
1
Можете ли вы объяснить, почему, SETX а не SETработает.
ChrisF
Во-первых, я не использовал командную строку, я использовал системный диалог. Во-вторых, моя модель поведения прекрасно работает в Windows 7, но иногда не в Windows 8. Можете ли вы указать документацию, которая показывает, как SET и SETX изменились между Windows 7 и Windows 8?
mawcsco
0

Если вы используете Windows 8.1, откройте командную строку от имени администратора, затем вызовите команду PATH, и вы должны увидеть, что она появляется там. Когда вы вернетесь к обычному cmd, он также появится. И на самом деле, вы должны иметь возможность запустить добавленное приложение из командной строки.

viktorkh
источник
-1

Это работает, если вы используете Win + R с рабочего стола для запуска cmd.exe? Я предполагаю, что запуск его с начального экрана приводит к тому, что родительский файл запущенного cmd.exe отличается от файла explorer.exe (WSAHost.exe, IIRC или как его там), и этот родительский процесс не обновляет свою среду во время сообщений WM_SETTINGCHANGE. У меня нет машины под управлением Windows 8 для тестирования ...

user348438
источник
Даже в Windows 8 интерфейс начального экрана, кажется, все является частью explorer.exe, потому что он исчезает при уничтожении explorer.exe.
Бинки