Чому мій командний рядок Windows 8 не оновить свій шлях


21

Мені потрібно було додати новий запис до моєї змінної PATH. Для мене це звичайна діяльність в моїй роботі, але я нещодавно почав використовувати Windows 8. Я припускав, що процес буде подібний до Windows 7, Vista, XP ...

Ось моя послідовність подій:

  1. Відкрийте Властивості системи (Пуск-> [тип "Панель управління"] -> Панель управління \ Система та безпека \ Система -> Розширені налаштування системи -> Змінні середовища)
  2. Додайте новий шлях до початку моєї змінної USER PATH (C: \ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. Відкрив командний рядок (Start -> [type "командний рядок" enter] -> [type "path" enter])

Мій новий запис шляху недоступний (див. Додане зображення та відео). Я дублював такий самий процес на машині Windows 7, і він працював.

Захоплення екрана змінними середовища

EDIT

Відео змінних середовища Windows і командного рядка

EDIT

Це, безумовно, не поведінка 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?

EDIT 2014-04-28

Через це та кілька інших проблем ми більше не використовуємо Windows 8 на робочому столі. У нас немає середовища, щоб продовжувати тестувати та експериментувати з цією проблемою. На цю проблему досі немає відповіді чи вирішення цієї проблеми. Відповіді нижче не вирішили нашу проблему.


2
Я думаю, що вам потрібно перезавантажитись після внесення змін, щоб вони вступили в силу.
Енігма

@Enigma Чому? Мені не потрібно було перезавантажуватися в Windows 7, Vista, XP, 2000 ...
mawcsco

@mawcsco Ви зробили принаймні 7. Підказки команд "Відкриття" в меню "Пуск" запускаються із середовищем із оболонки Провідника, яка була завантажена під час входу в систему. Потрібно або вбити / перезапустити провідник, вийти з системи або ввійти назад або перезапустити систему.
Дарт Android

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, коли повернусь додому, якщо до цього часу ніхто не матиме відповіді.
Дарт Android

5
Якщо ви змінили змінні середовища, використовуючи діалогове вікно «Властивості системи», зміни застосовуються негайно до поточно запущеного екземпляра Провідника, і всі процеси, розпочаті згодом, отримують нове середовище. Уже запущені процеси автоматично не оновлюють змінні середовища, якщо вони не обробляють WM_SETTINGCHANGEповідомлення.
Олексій Іванов

1
Чувак, це допомогло мені зрозуміти проблему, з якою я все-таки виник. Я використовую AutoHotkey для запуску командного рядка, і він не працював, поки я не перезапустив автоматичну клавішу!
Мосс

1
@mawcsco Це працювало для мене, я використовую Windows 7.
laike9m,

3

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

...

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

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


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

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

Жодна з програм, що постачаються з Windows 95 та Windows 98, включаючи Провідник Windows та Менеджер програм, не відповідає на це повідомлення. Таким чином, хоча ця стаття технічно може бути реалізована в Windows 95 та Windows 98, немає жодного ефекту, окрім як повідомляти сторонні програми. Єдиний спосіб зміни змінних глобальних умов середовища в Windows 95 - це зміна файлу autoexec.bat та перезавантаження.


2
Провідник Windows в Windows 7 обробляє це повідомлення, і досить перезапустити командний рядок із панелі завдань або меню «Пуск».
Олексій Іванов

"Зміни змінних середовища повинні набути чинності негайно, якщо ви внесете зміни через головне діалогове вікно" Властивості "для відповідного комп’ютера (перейдіть до" Мій комп'ютер | Властивості | Додаткові | Змінні середовища "). Після збереження змін" Провідник "передає повідомлення WM_SETTINGCHANGE до всіх вікон, щоб повідомити їх про зміну ". serverfault.com/questions/8855/…
maccsco

2
"Система Порада Ця стаття стосується іншої версії Windows, ніж тієї, яку ви використовуєте. Вміст у цій статті може не стосуватися вас. Відвідайте Центр рішень Windows 8"
mawcsco

Мене не здивувало б, що це деталь реалізації та що Microsoft не мала намірів підтримувати цю поведінку в Windows 8 або вище.
surfasb

1

Проблема полягає у налаштуваннях користувача. У вікні 8 кожен користувач має власні змінні середовища.

Відкрийте Властивості системи (Пуск-> [тип "Панель управління"] -> Панель управління \ Система та безпека \ Система -> Розширені налаштування системи -> Змінні середовища)

Наведений вище підхід буде редагувати змінні середовища для кореневого користувача, можливо, не для вашого поточного користувача.

Вам слід перейти до акаунта користувача -> вибрати поточний рахунок -> змінити змінні середовища

Після зміни перезавантажте оболонку живлення. Потім

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"


1
Чи можете ви пояснити, чому, SETX а не SETпрацює.
ChrisF

По-перше, я не використовував командний рядок, я використовував діалогове вікно системи. По-друге, моя поведінка добре працює в Windows 7, але іноді не в Windows 8. Чи можете ви вказати на документацію, яка показує, як SET і SETX змінилися між Windows 7 та Windows 8?
mawcsco

0

Якщо ви використовуєте Windows 8.1, відкрийте командний рядок як адміністратор, а потім зателефонуйте команді PATH, і ви побачите, що вона там з’являється. Коли ви повернетесь до звичайного cmd, він також з’явиться. По суті, ви повинні мати можливість запустити додану програму з командного рядка.



-1

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


Навіть у Windows 8 користувальницький інтерфейс початкового екрану, здається, є частиною Explor.exe, оскільки він зникає при вбиванні Explor.exe.
бінкі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.