สิ่งนี้ได้รับการคุ้มครองค่อนข้างน้อย แต่มีข้อมูลสำคัญที่ขาดหายไป หวังว่าฉันสามารถช่วยให้ชัดเจนว่างานนี้และบรรเทาความเหนื่อยล้าให้กับนักเดินทาง :-)
ลบออกจากกระบวนการปัจจุบัน
เห็นได้ชัดว่าทุกคนรู้ว่าคุณเพียงแค่ทำสิ่งนี้เพื่อลบตัวแปรสภาพแวดล้อมออกจากกระบวนการปัจจุบันของคุณ:
set FOO=
ลบแบบถาวร
มีตัวแปรสภาพแวดล้อมสองชุดทั้งระบบและผู้ใช้
ลบตัวแปรสภาพแวดล้อมของผู้ใช้:
reg delete "HKCU\Environment" /v FOO /f
ลบตัวแปรสภาพแวดล้อมทั้งระบบ:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO
ใช้ค่าโดยไม่ต้องรีบูตเครื่อง
นี่คือข้อมูลมายากลที่ขาดหายไป! คุณสงสัยว่าทำไมหลังจากคุณทำเช่นนี้เมื่อคุณเปิดหน้าต่างคำสั่งใหม่ตัวแปรสภาพแวดล้อมยังคงอยู่ที่นั่น เหตุผลเป็นเพราะ explorer.exe ไม่ได้ปรับปรุงสภาพแวดล้อม เมื่อกระบวนการหนึ่งเปิดตัวอีกกระบวนการใหม่จะสืบทอดสภาพแวดล้อมจากกระบวนการที่เปิดใช้งาน
มีสองวิธีในการแก้ไขปัญหานี้โดยไม่ต้องรีบูตเครื่อง วิธีที่โหดร้ายที่สุดคือฆ่ากระบวนการ explorer.exe ของคุณและเริ่มต้นใหม่อีกครั้ง คุณสามารถทำได้จากที่ Task Manager อย่างไรก็ตามฉันไม่แนะนำวิธีนี้
วิธีอื่นคือบอก explorer.exe ว่าสภาพแวดล้อมมีการเปลี่ยนแปลงและควรอ่านซ้ำ สิ่งนี้ทำได้โดยการกระจายข้อความ Windows (WM_SETTINGCHANGE) สามารถทำได้ด้วยสคริปต์ PowerShell แบบง่าย ๆ คุณสามารถเขียนได้อย่างง่ายดายเพื่อทำสิ่งนี้ แต่ฉันพบหนึ่งในการตั้งค่าการปรับปรุงหน้าต่างหลังจากการเปลี่ยนแปลงสคริปต์ :
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);
สรุป
ดังนั้นหากต้องการลบตัวแปรสภาพแวดล้อมของผู้ใช้ชื่อ "FOO" และมีการเปลี่ยนแปลงที่แสดงในกระบวนการที่คุณเรียกใช้หลังจากนั้นให้ทำดังนี้
- บันทึกสคริปต์ PowerShell ไปยังไฟล์ (เราจะเรียกมันว่า updateenv.ps1)
- ทำสิ่งนี้จากบรรทัดคำสั่ง: reg ลบ "HKCU \ Environment" / v FOO / f
- เรียกใช้ updateenv.ps1
- ปิดและเปิดพรอมต์คำสั่งของคุณอีกครั้งและคุณจะเห็นว่าไม่มีการกำหนดตัวแปรสภาพแวดล้อมอีกต่อไป
หมายเหตุคุณอาจต้องอัปเดตการตั้งค่า PowerShell ของคุณเพื่อให้คุณเรียกใช้สคริปต์นี้ได้ แต่ฉันจะปล่อยให้เป็นแบบฝึกหัด Google-fu ให้คุณ