Điều này đã được đề cập khá nhiều, nhưng có một thông tin quan trọng bị thiếu. Hy vọng, tôi có thể giúp làm rõ cách thức hoạt động của nó và cung cấp một số cứu trợ cho khách du lịch mệt mỏi. :-)
Xóa khỏi quy trình hiện tại
Rõ ràng, mọi người đều biết rằng bạn chỉ cần làm điều này để xóa một biến môi trường khỏi quy trình hiện tại của bạn:
set FOO=
Xóa liên tục
Có hai bộ biến môi trường, toàn hệ thống và người dùng.
Xóa biến môi trường người dùng:
reg delete "HKCU\Environment" /v FOO /f
Xóa biến môi trường toàn hệ thống:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO
Áp dụng giá trị mà không cần khởi động lại
Đây là thông tin ma thuật còn thiếu! Bạn đang tự hỏi tại sao sau khi bạn làm điều này, khi bạn khởi chạy một cửa sổ lệnh mới, biến môi trường vẫn còn đó. Lý do là vì explorer.exe chưa cập nhật môi trường của nó. Khi một quy trình khởi chạy một quy trình khác, quy trình mới sẽ kế thừa môi trường từ quy trình đã khởi chạy nó.
Có hai cách để khắc phục điều này mà không cần khởi động lại. Cách mạnh mẽ nhất là giết quá trình explorer.exe của bạn và bắt đầu lại. Bạn có thể làm điều đó từ Trình quản lý tác vụ . Tôi không khuyên dùng phương pháp này, tuy nhiên.
Một cách khác là bằng cách nói với explorer.exe rằng môi trường đã thay đổi và nó sẽ đọc lại nó. Điều này được thực hiện bằng cách truyền phát một thông báo Windows (WM_SETTINGCHANGE). Điều này có thể được thực hiện với một tập lệnh PowerShell đơn giản. Bạn có thể dễ dàng viết một cái để làm điều này, nhưng tôi đã tìm thấy một trong Cài đặt cửa sổ cập nhật sau khi thay đổi theo kịch bản :
if (-not ("win32.nativemethods" -as [type])) {
add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
"@
}
$HWND_BROADCAST = [intptr]0xffff;
$WM_SETTINGCHANGE = 0x1a;
$result = [uintptr]::zero
[win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,[uintptr]::Zero, "Environment", 2, 5000, [ref]$result);
Tóm lược
Vì vậy, để xóa biến môi trường người dùng có tên "FOO" và thay đổi được phản ánh trong các quy trình bạn khởi chạy sau đó, hãy làm như sau.
- Lưu tập lệnh PowerShell vào một tệp (chúng tôi sẽ gọi nó là updateenv.ps1).
- Thực hiện việc này từ dòng lệnh: reg xóa "HKCU \ Môi trường" / v FOO / f
- Chạy updateenv.ps1.
- Đóng và mở lại dấu nhắc lệnh của bạn và bạn sẽ thấy biến môi trường không còn được xác định.
Lưu ý, có thể bạn sẽ phải cập nhật cài đặt PowerShell để cho phép bạn chạy tập lệnh này, nhưng tôi sẽ để nó như một bài tập Google-fu cho bạn.