Tại sao dòng lệnh Windows 8 của tôi không cập nhật đường dẫn của nó


21

Tôi cần thêm một mục mới vào biến PATH của mình. Đây là một hoạt động phổ biến đối với tôi trong công việc, nhưng gần đây tôi đã bắt đầu sử dụng Windows 8. Tôi cho rằng quy trình này sẽ tương tự như Windows 7, Vista, XP ...

Đây là chuỗi sự kiện của tôi:

  1. Thuộc tính hệ thống mở (Bắt đầu-> [loại "Bảng điều khiển"] -> Bảng điều khiển \ Hệ thống và bảo mật \ Hệ thống -> Cài đặt hệ thống nâng cao -> Biến môi trường)
  2. Thêm đường dẫn mới vào đầu biến USER PATH của tôi (C: \ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. Đã mở một dấu nhắc lệnh (Bắt đầu -> [gõ "dấu nhắc lệnh" enter] -> [loại "đường dẫn" enter]

Mục nhập đường dẫn mới của tôi không có sẵn (xem hình ảnh đính kèm và vide). Tôi đã sao chép chính xác quy trình tương tự trên máy Windows 7 và nó đã hoạt động.

Chụp màn hình các biến môi trường

CHỈNH SỬA

Windows 8 Biến môi trường và lệnh nhắc nhở video

CHỈNH SỬA

Đây chắc chắn không phải là hành vi của Windows 7. Xem video này để xem hành vi tôi mong đợi làm việc trong Windows 7. http://youtu.be/95JXY5X0fII

EDIT 5/31/2013

Vì vậy, sau nhiều thất vọng, tôi đã viết một ứng dụng C # nhỏ để kiểm tra WM_SETTINGCHANGEsự kiện này. Mã này nhận được sự kiện trong cả Windows 7 và Windows 8. Tuy nhiên, trong Windows 8 trên hệ thống của tôi, tôi không nhận được đường dẫn chính xác; nhưng, tôi làm trong Windows 7. Điều này không thể được sao chép trong các hệ thống Windows 8 khác.

Đây là mã 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 tương đương với WM_SETTINGCHANGE

Chương trình C # đang chạy trong Windows 7 (bạn có thể thấy sự kiện đi qua và nó chọn đúng đường dẫn).

Chương trình C # đang chạy trong Windows 8 (bạn có thể thấy sự kiện đi qua, nhưng đường dẫn sai).

Có một cái gì đó về môi trường của tôi đang kết thúc vấn đề này. Tuy nhiên, đây có phải là lỗi của Windows 8 không?

EDIT 2014-04-28

Do vấn đề này và một số vấn đề khác, chúng tôi không còn sử dụng Windows 8 trên máy tính để bàn. Chúng tôi không có môi trường để tiếp tục thử nghiệm và thử nghiệm vấn đề này. Vẫn chưa có câu trả lời hoặc giải quyết cho vấn đề này cho chúng tôi. Các câu trả lời dưới đây không giải quyết vấn đề của chúng tôi.


2
Tôi nghĩ bạn cần khởi động lại sau khi thực hiện các thay đổi để chúng có hiệu lực.
Bí tích

@Enigma Tại sao? Tôi không cần phải khởi động lại trong Windows 7, Vista, XP, 2000 ...
mawcsco

@mawcsco Bạn đã làm ít nhất 7. Lệnh nhắc mở từ menu bắt đầu khởi chạy với môi trường từ trình bao Explorer, được tải khi bạn đăng nhập. Bạn cần phải hủy / khởi động lại trình thám hiểm, đăng xuất hoặc đăng nhập lại hoặc khởi động lại hệ thống.
Darth Android

1
@Enigma Không cần thiết phải khởi động lại. serverfault.com/questions/8855/
trộm

1
Tôi vừa kiểm tra điều này trên cả Windows 7 và Windows 8: trong cả hai trường hợp, biến môi trường mới có thể nhìn thấy cmdkhi một phiên bản mới được khởi chạy. Tất nhiên, việc chạy cmdđã không nhận được môi trường cập nhật.
Alexey Ivanov

Câu trả lời:


7

Nếu bạn đang khởi chạy Dấu nhắc Lệnh từ menu bắt đầu hoặc lối tắt trên thanh tác vụ, bạn phải:

  • Khởi động lại explorer. Giết nó và khởi động lại nó.
  • Đăng xuất và quay lại (có hiệu quả khởi động lại explorer).
  • Khởi động lại hệ thống (cũng khởi động lại hiệu quả explorer).

Môi trường không cập nhật ngay lập tức vì các môi trường được kế thừa từ quy trình cha của chúng, ngoại trừ explorer, được hệ thống khởi động khi đăng nhập. Đây là cách nó hoạt động trên hệ thống Windows 7 của tôi.

Vì vậy, việc thay đổi Biến môi trường cập nhật các khóa đăng ký, nhưng các khóa này không được đọc lại cho đến khi hệ thống phải xây dựng môi trường đăng nhập mới cho một số quy trình được khởi chạy. Hầu hết thời gian, điều này không xảy ra vì các quy trình là con của một quy trình đã có môi trường, do đó môi trường được kế thừa.


2
Hoàn toàn sai cho Windows 7. Xem video tôi liên kết trong bài viết của tôi ở trên.
mawcsco

1
Huh. Bạn chắc chắn đúng ở đó, mặc dù tôi chắc chắn đã có những thay đổi của mình không áp dụng ngay cho các cửa sổ giao diện điều khiển mới trên Win 7 trước đó. Tôi không thể nhớ quy trình làm việc chính xác của tôi là gì. Tôi sẽ chơi xung quanh với hệ thống Win 8 của tôi khi tôi về nhà nếu không có ai trả lời cho bạn trước đó.
Darth Android

5
Nếu bạn đã thay đổi các biến môi trường bằng hộp thoại Thuộc tính hệ thống, các thay đổi sẽ được áp dụng ngay lập tức cho phiên bản Explorer hiện đang chạy và tất cả các quy trình được bắt đầu sau đó có được môi trường mới. Các quy trình đã chạy không tự động cập nhật các biến môi trường của chúng trừ khi chúng xử lý WM_SETTINGCHANGEthông báo.
Alexey Ivanov

1
Anh bạn, điều này đã giúp tôi hiểu vấn đề mà tôi đang gặp phải. Tôi sử dụng AutoHotkey để khởi chạy một dấu nhắc lệnh và nó không hoạt động cho đến khi tôi khởi động lại autohotkey!
Rêu

1
@mawcsco Nó hoạt động với tôi, tôi đang sử dụng Windows 7.
laike9m

3

Từ: http://support.microsoft.com/kb/104011 qua /server//q/8855/158027

...

Tuy nhiên, lưu ý rằng sửa đổi các biến môi trường không dẫn đến thay đổi ngay lập tức. Ví dụ: nếu bạn bắt đầu một Dấu nhắc lệnh khác sau khi thực hiện các thay đổi, các biến môi trường sẽ phản ánh các giá trị trước đó (không phải hiện tại). Các thay đổi không có hiệu lực cho đến khi bạn đăng xuất và sau đó đăng nhập lại.

Để thực hiện các thay đổi này mà không cần phải đăng xuất, hãy phát thông báo WM_SettINGCHANGE tới tất cả các cửa sổ trong hệ thống, để mọi ứng dụng quan tâm (như Windows Explorer, Trình quản lý chương trình, Trình quản lý tác vụ, Bảng điều khiển, v.v.) có thể thực hiện cập nhật. THÊM THÔNG TIN


Ví dụ: trên các hệ thống dựa trên Windows NT, đoạn mã sau sẽ truyền bá các thay đổi đối với các biến môi trường được sử dụng trong Dấu nhắc lệnh:

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

Không có ứng dụng nào đi kèm với Windows 95 và Windows 98, bao gồm Windows Explorer và Trình quản lý chương trình, trả lời thông báo này. Do đó, mặc dù bài viết này có thể được triển khai về mặt kỹ thuật trên Windows 95 và Windows 98, nhưng không có tác dụng nào ngoại trừ việc thông báo cho các ứng dụng của bên thứ ba. Phương pháp duy nhất để thay đổi các biến môi trường toàn cầu trên Windows 95 là sửa đổi tệp autoexec.bat và khởi động lại.


2
Windows Explorer trong Windows 7 xử lý thông báo này và nó đủ để khởi động lại Dấu nhắc lệnh từ thanh tác vụ hoặc menu Bắt đầu.
Alexey Ivanov

"Các thay đổi đối với các biến môi trường sẽ có hiệu lực ngay lập tức, nếu bạn thực hiện thay đổi thông qua hộp thoại Thuộc tính chính cho máy tính được đề cập (đi tới Máy tính của tôi | Thuộc tính | Nâng cao | Biến môi trường). Sau khi các thay đổi được lưu, Explorer sẽ phát thông báo WM_SettINGCHANGE đến tất cả các cửa sổ để thông báo cho họ về sự thay đổi. " serverfault.com/questions/8855/
trộm

2
"Mẹo hệ thống Bài viết này áp dụng cho một phiên bản Windows khác với phiên bản bạn đang sử dụng. Nội dung trong bài viết này có thể không liên quan đến bạn. Truy cập Trung tâm giải pháp Windows 8"
mawcsco

Tôi sẽ không ngạc nhiên khi đây là một chi tiết triển khai và Microsoft không có ý định hỗ trợ hành vi này trong Windows 8 trở lên.
Surfasb

1

Vấn đề là với cài đặt người dùng của bạn. Trong Window 8, mỗi người dùng có các biến môi trường riêng.

Thuộc tính hệ thống mở (Bắt đầu-> [loại "Bảng điều khiển"] -> Bảng điều khiển \ Hệ thống và bảo mật \ Hệ thống -> Cài đặt hệ thống nâng cao -> Biến môi trường)

Cách tiếp cận trên sẽ chỉnh sửa các biến môi trường cho người dùng root, có thể không phải là người dùng hiện tại của bạn.

Bạn nên truy cập tài khoản người dùng -> chọn tài khoản hiện tại của bạn -> thay đổi các biến môi trường

Sau khi thay đổi, khởi động lại vỏ điện. Sau đó

echo $env:JAVA_HOME

hoặc là

Get-ChildItem env

Hy vọng điều này sẽ giúp bạn.


Tôi nghĩ rằng bạn có thể đã bỏ lỡ chi tiết trong ảnh chụp màn hình và video hiển thị hộp thoại với "Biến người dùng cho mwillia3". Đó là tên người dùng của tôi. Tôi biết chắc chắn rằng tôi đã chỉnh sửa các biến môi trường chính xác. Ứng dụng C # kích hoạt sự kiện, với giá trị cũ, không phải giá trị được cập nhật. Tôi từ bỏ. Tôi khá chắc chắn đây là lỗi Win 8 và tôi không còn có quyền truy cập vào Windows 8 để kiểm tra điều này.
mawcsco

Một số người không luôn luôn đọc chi tiết. Tôi thấy điều này trên một số hệ thống chứ không phải trên các hệ thống khác, tôi thậm chí đã nhìn thấy nó trên Windows 7/2008. Không có vần điệu hoặc lý do khi nó xảy ra mà tôi đã tìm thấy.
ferventcoder

Vấn đề tương tự với Windows Server 2012 r2 ngay cả sau khi truyền WM_SETTINGSCHANGED. Tôi tin rằng đó là một lỗi cửa sổ.
vezenkov

0

Hãy thử SETX thay vì SET. Ví dụSETX PATH "%PATH%;MyPath"


1
Bạn có thể giải thích tại sao SETX chứ không phải SETlàm việc.
ChrisF

Đầu tiên, tôi không sử dụng dòng lệnh, tôi đang sử dụng hộp thoại hệ thống. Thứ hai, mô hình hành vi của tôi hoạt động tốt trong Windows 7, nhưng đôi khi không có trong Windows 8. Bạn có thể chỉ ra tài liệu cho thấy cách thức SET và SETX thay đổi giữa Windows 7 và Windows 8 không?
mawcsco

0

Nếu bạn đang sử dụng Windows 8.1, hãy mở dấu nhắc lệnh với tư cách Quản trị viên, sau đó gọi lệnh PATH và bạn sẽ thấy nó xuất hiện ở đó. Khi bạn trở lại cmd bình thường, nó cũng sẽ hiển thị. Và như thực tế, bạn sẽ có thể bắt đầu ứng dụng được thêm từ dấu nhắc lệnh.



-1

Nó có hoạt động không nếu bạn sử dụng Win + R từ Desktop để khởi động cmd.exe? Tôi đoán là việc khởi động nó từ Màn hình Bắt đầu làm cho cha mẹ của cmd.exe đã khởi động khác với explorer.exe (WSAHost.exe, IIRC hoặc bất cứ thứ gì nó được đặt tên) và quy trình cha mẹ đó không cập nhật môi trường của nó trong các thông điệp WM_SettINGCHANGE. Tôi không có máy Windows 8 để kiểm tra ...


Ngay cả trong Windows 8, UI màn hình bắt đầu dường như đều là một phần của explorer.exe vì nó biến mất khi explorer.exe bị giết.
binki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.