2010-09-03 38 views

Trả lời

18

Xin lỗi vì câu trả lời dài, nhưng câu trả lời ngắn cho câu hỏi của bạn là không thể.

Trước hết bạn nên hiểu cách biến môi trường hoạt động. Có một số địa điểm trong sổ đăng ký như HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentHKEY_CURRENT_USER\Environment nơi các biến môi trường sẽ được giữ. Khi khởi động, hệ điều hành sẽ đọc các khóa registry này. Sau đó, một cửa sổ quá trình tạo ra một quá trình cửa sổ. Quá trình cha mẹ có thể cung cấp cho quá trình khách hàng bất kỳ bộ biến môi trường nào. Nếu tiến trình cha không làm điều này, tiến trình con kế thừa các biến môi trường của các tiến trình cha.

Để có thể cập nhật các biến môi trường của quy trình đang chạy đối với các thông báo WM_WININICHANGE hoặc WM_SETTINGCHANGE. Một ứng dụng cửa sổ có thể diễn giải thông báo này và đọc lại các biến môi trường hiện tại từ sổ đăng ký HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentHKEY_CURRENT_USER\Environment. Vì vậy, bạn có thể trong các giá trị registry thay đổi chung theo HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment hoặc HKEY_CURRENT_USER\Environment và gửi

SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment"); 

Sẽ tốt hơn nhiều để sử dụng SendMessageTimeout thay vì SendMessage, nhưng ý tưởng sẽ giữ nguyên. Vấn đề là các quy trình khác không được chờ tin nhắn và làm điều gì đó. Hầu hết các ứng dụng bàn điều khiển không có vòng lặp tin nhắn và không làm bất cứ điều gì nếu bạn gửi tin nhắn như vậy.

Vì vậy, điều quan trọng là phải hiểu rằng có không cách đơn giản để cập nhật biến môi trường của tất cả các quy trình mà không cần khởi động lại máy tính. Bạn nên có một sự hiểu biết rõ ràng về điều này và giảm câu hỏi của bạn một chút.

Nếu bạn cập nhật các môi trường trong registry và gửi SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment") sau đó mới chế thông thường được tạo ra bởi Explorer.exe sẽ có các biến môi trường mới, nhưng cmd.exe sẽ không làm điều này.

Nếu bạn muốn cập nhật biến môi trường hiện tại cmd.exe bên trong chạy hàng loạt, bạn có thể thực hiện các thao tác sau: Bạn có thể tạo tệp CMD mới ví dụ t.cmd trong thư mục% TEMP%, viết tệp SET PATH=%PATH%;C:\BlaBla và sau đó sử dụng call %TEMP%\t.cmddell %TEMP%\t.cmd để cập nhật biến môi trường của cmd.exe hiện tại.

Để chính xác có nhiều địa điểm được sử dụng để tạo biến môi trường của các quy trình được tạo mới. Đây là các khóa con của khóa HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths%SystemRoot%\System32\autoexec.nt tệp. Một cái sẽ được sử dụng cho các quá trình được tạo bởi ShellExecuteShellExecuteEx (ví dụ: Explorer.exe) và một quy trình khác cho ứng dụng bảng điều khiển.

+2

Wow, cảm ơn rất nhiều câu trả lời chi tiết. Tôi chắc chắn nó sẽ có giá trị cho những người khác nữa. Điều đó nói rằng, tôi hơi thất vọng một chút khi tôi nghĩ việc làm điều đó dễ dàng như thế nào trong Linux. – madewulf

4

Nếu bạn chỉ quan tâm đến các phiên bản mới, và bạn thực sự muốn nó được thực hiện thông qua một tập tin thực thi, thì setx là những gì bạn đang tìm kiếm.

  • /M sẽ thay đổi PATH trong HKEY_LOCAL_MACHINE thay vì HKEY_CURRENT_USER.
    tức là biến hệ thống thay vì người dùng.
    dụ: SETX /M PATH "%PATH%;C:\your path with spaces"

Nếu bạn muốn trực tiếp thay đổi một biến môi trường cho các quá trình đang chạy, tốt, yeah, đó là phức tạp và apparently not recommended:

Altering the environment variables of a child process during process creation 
is the only way one process can directly change the environment variables of 
another process. A process can never directly change the environment variables 
of another process that is not a child of that process. 

Nếu không, như Oleg cho biết, lập trình cách tốt nhất là thay đổi sổ đăng ký và gửi WM_SETTINGCHANGE và hy vọng các ứng dụng đủ tốt để chọn nó.

+0

Tuyệt vời, đây chính xác là những gì tôi đang tìm kiếm! Chỉ cho bản ghi: ** 1) ** '/ M' sẽ đặt biến hệ thống thay vì biến người dùng mới khi đặt' PATH'. Cú pháp Le: 'SETX/M PATH"% PATH%; C: \ đường dẫn của bạn với dấu cách "' ** 2) ** Một nhược điểm: tất cả các biến hệ thống trong 'PATH' sẽ được giải quyết, chẳng hạn như'% SystemRoot% '(sẽ trở thành 'C: \ Windows'), mặc dù tôi không nghĩ đó là sai. – Qwerty

Các vấn đề liên quan