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\Environment
và HKEY_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\Environment
và HKEY_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.cmd
và dell %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
và %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 ShellExecute
và ShellExecuteEx
(ví dụ: Explorer.exe) và một quy trình khác cho ứng dụng bảng điều khiển.
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