यह काफी हद तक कवर किया गया है, लेकिन जानकारी का एक महत्वपूर्ण टुकड़ा है जो गायब है। उम्मीद है, मैं यह स्पष्ट करने में मदद कर सकता हूं कि यह कैसे काम करता है और थके हुए यात्रियों को कुछ राहत देता है। :-)
वर्तमान प्रक्रिया से हटाएं
जाहिर है, हर कोई जानता है कि आप अपनी मौजूदा प्रक्रिया से पर्यावरण चर को हटाने के लिए ऐसा करते हैं:
set FOO=
लगातार हटाना
पर्यावरण चर, सिस्टम-वाइड और उपयोगकर्ता के दो सेट हैं।
हटाएं उपयोगकर्ता पर्यावरण चर:
reg delete "HKCU\Environment" /v FOO /f
सिस्टम-वाइड वातावरण चर को हटाएं:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO
रिबूट के बिना मूल्य लागू करें
यहां जादू की जानकारी गायब है! आप सोच रहे हैं कि ऐसा करने के बाद, जब आप एक नई कमांड विंडो लॉन्च करते हैं, तो पर्यावरण चर अभी भी है। इसका कारण यह है क्योंकि explorer.exe ने अपने पर्यावरण को अपडेट नहीं किया है। जब एक प्रक्रिया दूसरे को लॉन्च करती है, तो नई प्रक्रिया पर्यावरण को उस प्रक्रिया से विरासत में मिलती है जो इसे लॉन्च करती है।
रिबूट किए बिना इसे ठीक करने के दो तरीके हैं। सबसे brute-force तरीका यह है कि आपके explorer.exe प्रक्रिया को मारकर इसे फिर से शुरू करें। आप कार्य प्रबंधक से कर सकते हैं । मैं इस विधि की सिफारिश नहीं करता, हालांकि।
दूसरा तरीका यह है कि एक्सप्लोरर। Exe कह रहा है कि पर्यावरण बदल गया है और इसे इसे फिर से पढ़ना चाहिए। यह एक विंडोज संदेश (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-फू अभ्यास के रूप में छोड़ दूंगा।