Mengapa baris Perintah Windows 8 saya tidak memperbarui jalurnya

21

Saya perlu menambahkan entri baru ke variabel PATH saya. Ini adalah kegiatan umum bagi saya dalam pekerjaan saya, tetapi saya baru-baru ini mulai menggunakan Windows 8. Saya berasumsi prosesnya akan mirip dengan Windows 7, Vista, XP ...

Inilah urutan acara saya:

  1. Buka properti Sistem (Mulai-> [ketik "Panel Kontrol"] -> Panel Kontrol \ Sistem dan Keamanan \ Sistem -> Pengaturan sistem lanjutan -> Variabel Lingkungan)
  2. Tambahkan path baru ke awal variabel USER PATH saya (C: \ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. Membuka command prompt (Mulai -> [ketik "command prompt" enter] -> [type "path" enter]

Entri jalur baru saya tidak tersedia (lihat gambar dan vide terlampir). Saya menduplikasi proses yang sama persis pada mesin Windows 7 dan berhasil.

Ambil layar variabel lingkungan

EDIT

Variabel Lingkungan Windows 8 dan video Command Prompt

EDIT

Ini jelas bukan perilaku Windows 7. Tonton video ini untuk melihat perilaku yang saya harapkan bekerja di Windows 7. http://youtu.be/95JXY5X0fII

EDIT 5/31/2013

Jadi, setelah frustrasi, saya menulis aplikasi C # kecil untuk menguji WM_SETTINGCHANGEacara tersebut. Kode ini menerima acara di Windows 7 dan Windows 8. Namun, di Windows 8 di sistem saya, saya tidak mendapatkan jalur yang benar; tapi, saya lakukan di Windows 7. Ini tidak dapat direproduksi di sistem Windows 8 lainnya.

Ini kode 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 setara dengan WM_SETTINGCHANGE

Program C # berjalan di Windows 7 (Anda dapat melihat acara datang dan mengambil jalur yang benar).

Program C # berjalan di Windows 8 (Anda dapat melihat acara tersebut terjadi, tetapi jalur yang salah).

Ada sesuatu tentang lingkungan saya yang memicu masalah ini. Namun, apakah ini bug Windows 8?

EDIT 2014-04-28

Karena ini dan beberapa masalah lainnya, kami tidak lagi menggunakan Windows 8 di desktop. Kami tidak memiliki lingkungan untuk melanjutkan pengujian dan percobaan dengan masalah ini. Masih belum ada jawaban atau resolusi untuk masalah ini bagi kami. Jawaban di bawah tidak menyelesaikan masalah kami.

mawcsco
sumber
2
Saya pikir Anda perlu melakukan reboot setelah membuat perubahan agar bisa diterapkan.
Enigma
@ Enigma Mengapa? Saya tidak perlu memulai ulang pada Windows 7, Vista, XP, 2000 ...
mawcsco
@ mawcsco Setidaknya Anda melakukannya di 7. Perintah pembukaan meminta dari menu mulai diluncurkan dengan lingkungan dari shell Explorer, yang dimuat ketika Anda login. Anda harus membunuh / memulai kembali explorer, logout atau kembali, atau restart sistem.
Darth Android
1
@ Enigma A reboot tidak perlu. serverfault.com/questions/8855/…
mawcsco
1
Saya baru saja memeriksa ini pada Windows 7 dan Windows 8: dalam kedua kasus variabel lingkungan baru terlihat cmdketika instance baru diluncurkan. Tentu saja yang sudah berjalan cmdtidak mendapatkan lingkungan yang diperbarui.
Alexey Ivanov

Jawaban:

7

Jika Anda meluncurkan Command Prompt dari menu mulai atau pintasan di bilah tugas, Anda harus:

  • Mulai ulang explorer. Bunuh dan luncurkan kembali.
  • Logout dan kembali (yang secara efektif diluncurkan kembali explorer).
  • Mulai ulang sistem (yang juga diluncurkan kembali secara efektif explorer).

Lingkungan tidak segera diperbarui karena lingkungan diwarisi dari proses induknya, dengan pengecualian explorer, yang dimulai oleh sistem saat masuk. Ini adalah bagaimana berperilaku pada sistem Windows 7 saya.

Jadi, mengubah Variabel Lingkungan memperbarui kunci registri, tetapi kunci ini tidak dibaca kembali sampai sistem harus membangun lingkungan login baru untuk beberapa proses yang diluncurkan. Sebagian besar waktu, ini tidak terjadi karena proses adalah anak-anak dari suatu proses yang sudah memiliki lingkungan, sehingga lingkungan diwarisi.

Darth Android
sumber
2
Benar-benar salah untuk Windows 7. Lihat video yang saya tautkan dalam posting saya di atas.
mawcsco
1
Hah. Anda pasti benar di sana, meskipun perubahan saya pasti tidak berlaku langsung ke jendela konsol baru di Win 7 sebelumnya. Saya tidak ingat apa sebenarnya alur kerja saya. Saya akan bermain-main dengan sistem Win 8 saya ketika saya pulang jika tidak ada yang menjawab Anda saat itu.
Darth Android
5
Jika Anda mengubah variabel lingkungan menggunakan dialog Properti sistem, perubahan diterapkan segera ke instance Explorer yang sedang berjalan, dan semua proses yang dimulai setelah itu mendapatkan lingkungan baru. Proses yang sudah berjalan tidak secara otomatis memperbarui variabel lingkungannya kecuali jika mereka menangani WM_SETTINGCHANGEpesan.
Alexey Ivanov
1
Bung, ini membantu saya memahami masalah yang saya alami. Saya menggunakan AutoHotkey untuk meluncurkan prompt perintah, dan itu tidak berfungsi sampai saya memulai kembali autohotkey!
Moss
1
@ mawcsco Ini bekerja untuk saya, saya menggunakan Windows 7.
laike9m
3

Dari: http://support.microsoft.com/kb/104011 via /server//q/8855/158027

...

Namun, perhatikan bahwa modifikasi pada variabel lingkungan tidak menghasilkan perubahan langsung. Misalnya, jika Anda memulai Command Prompt lain setelah melakukan perubahan, variabel lingkungan akan mencerminkan nilai sebelumnya (bukan yang sekarang). Perubahan tidak berlaku sampai Anda keluar lalu masuk kembali.

Untuk melakukan perubahan ini tanpa harus keluar, tayangkan pesan WM_SETTINGCHANGE ke semua jendela dalam sistem, sehingga aplikasi apa pun yang tertarik (seperti Windows Explorer, Manajer Program, Manajer Tugas, Panel Kontrol, dan sebagainya) dapat melakukan pembaruan. INFORMASI LEBIH LANJUT


Misalnya, pada sistem berbasis Windows NT, fragmen kode berikut harus menyebarkan perubahan ke variabel lingkungan yang digunakan dalam Prompt Perintah:

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

Tak satu pun dari aplikasi yang dikirimkan dengan Windows 95 dan Windows 98, termasuk Windows Explorer dan Program Manager, merespons pesan ini. Jadi, sementara artikel ini secara teknis dapat diimplementasikan pada Windows 95 dan Windows 98, tidak ada efek kecuali untuk memberi tahu aplikasi pihak ketiga. Satu-satunya metode untuk mengubah variabel lingkungan global pada Windows 95 adalah memodifikasi file autoexec.bat dan reboot.

Enigma
sumber
2
Windows Explorer di Windows 7 menangani pesan ini, dan itu cukup untuk me-restart Command Prompt dari Taskbar atau menu Start.
Alexey Ivanov
"Perubahan ke variabel lingkungan akan segera berlaku, jika Anda membuat perubahan melalui dialog Properties utama untuk komputer yang bersangkutan (buka My Computer | Properties | Advanced | Variabel Lingkungan). Setelah perubahan disimpan, Explorer menyiarkan pesan WM_SETTINGCHANGE ke semua jendela untuk memberi tahu mereka tentang perubahan itu. " serverfault.com/questions/8855/…
mawcsco
2
"Tip Sistem Artikel ini berlaku untuk versi Windows yang berbeda dari yang Anda gunakan. Konten dalam artikel ini mungkin tidak relevan dengan Anda. Kunjungi Pusat Solusi Windows 8"
mawcsco
Tidak akan mengejutkan saya bahwa ini adalah detail implementasi dan bahwa Microsoft tidak memiliki niat untuk mendukung perilaku ini di Windows 8 atau lebih tinggi.
surfasb
1

Masalahnya dengan pengaturan pengguna Anda. Di Window 8, setiap pengguna memiliki variabel lingkungan sendiri.

Buka properti Sistem (Mulai-> [ketik "Panel Kontrol"] -> Panel Kontrol \ Sistem dan Keamanan \ Sistem -> Pengaturan sistem lanjutan -> Variabel Lingkungan)

Pendekatan di atas akan mengedit variabel lingkungan untuk pengguna root, mungkin bukan pengguna Anda saat ini.

Anda harus masuk ke akun pengguna -> pilih akun Anda saat ini -> ubah variabel lingkungan

Setelah berubah, hidupkan kembali shell daya. Kemudian

echo $env:JAVA_HOME

atau

Get-ChildItem env

Semoga ini bisa membantu Anda.

Vu Gia Truong
sumber
Saya pikir Anda mungkin telah melewatkan detail dalam tangkapan layar dan video saya yang menunjukkan dialog dengan "Variabel pengguna untuk mwillia3". Itu nama pengguna saya. Saya tahu pasti bahwa saya mengedit variabel lingkungan yang benar. Aplikasi C # memecat acara, dengan nilai lama, bukan nilai yang diperbarui. Aku menyerah. Saya cukup yakin ini adalah bug Win 8 dan saya tidak lagi memiliki akses ke Windows 8 untuk menguji ini.
mawcsco
Beberapa orang tidak selalu membaca detailnya. Saya melihat ini pada beberapa sistem dan bukan pada yang lain, saya bahkan pernah melihatnya di Windows 7/2008. Tidak ada sajak atau alasan ketika itu terjadi yang saya temukan.
ferventcoder
Masalah yang sama dengan Windows Server 2012 r2 bahkan setelah menyebarkan WM_SETTINGSCHANGED. Saya percaya ini adalah bug windows.
vezenkov
0

Coba SETX sebagai gantinya SET. MisalnyaSETX PATH "%PATH%;MyPath"

kt
sumber
1
Bisakah Anda menjelaskan mengapa SETX daripada SETbekerja.
ChrisF
Pertama, saya tidak menggunakan baris perintah, saya menggunakan dialog sistem. Kedua, pola perilaku saya berfungsi dengan baik di Windows 7, tetapi kadang-kadang tidak di Windows 8. Bisakah Anda menunjukkan dokumentasi yang menunjukkan bagaimana SET dan SETX berubah antara Windows 7 dan Windows 8?
mawcsco
0

Jika Anda menggunakan Windows 8.1, buka prompt perintah sebagai Administrator, kemudian panggil perintah PATH dan Anda akan melihatnya muncul di sana. Ketika Anda kembali ke cmd normal, itu juga akan muncul. Dan faktanya, Anda harus dapat memulai aplikasi yang ditambahkan dari command prompt.

viktorkh
sumber
-1

Apakah itu berfungsi jika Anda menggunakan Win + R dari Desktop untuk memulai cmd.exe? Dugaan saya adalah bahwa memulainya dari Layar Mulai menyebabkan induk cmd.exe mulai berbeda dari explorer.exe (WSAHost.exe, IIRC atau apa pun namanya), dan proses induk itu tidak memperbarui lingkungannya selama pesan WM_SETTINGCHANGE pesan. Saya tidak punya mesin Windows 8 untuk menguji ...

pengguna348438
sumber
Bahkan di Windows 8 UI Layar Mulai tampaknya semua menjadi bagian dari explorer.exe karena menghilang ketika explorer.exe terbunuh.
binki