OS स्तर कॉन्फ़िगरेशन से वातावरण चर निकालने के लिए कमांड लाइन


182

विंडोज में setxकमांड है:

Description:
    Creates or modifies environment variables in the user or system
    environment.

तो आप इस तरह एक चर सेट कर सकते हैं:

setx FOOBAR 1

और आप इस तरह मूल्य को साफ कर सकते हैं:

setx FOOBAR ""

हालाँकि, चर हटाया नहीं जाता है। यह रजिस्ट्री में रहता है:

foobar

तो आप वास्तव में चर को कैसे निकालेंगे?


3
setx केवल चर सेट करता है। आप बस उस लाइन के साथ इसे खाली कर रहे हैं।
फॉक्स विल्सन


चूँकि यह मुझे उचित मात्रा में खुदाई का काम लगा, इसलिए सुपर -कमांडर / q/297947/46834 को गैर-कमांड लाइन विकल्पों के लिए भी देखें ।
गैरी

जवाबों:


217

वर्तमान परिवेश से चर को हटाने के लिए ( स्थायी रूप से नहीं ):

set FOOBAR=

उपयोगकर्ता वातावरण से चर को स्थायी रूप से हटाने के लिए (जो डिफ़ॉल्ट स्थान setxइसे डालता है):

REG delete HKCU\Environment /F /V FOOBAR

यदि चर को सिस्टम वातावरण में सेट किया जाता है (जैसे यदि आप मूल रूप से इसे सेट करते हैं setx /M), एक व्यवस्थापक रन के रूप में:

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

नोट: REGऊपर दिए गए आदेश किसी भी मौजूदा प्रक्रियाओं को प्रभावित नहीं करेंगे (और कुछ नई प्रक्रियाएं जो मौजूदा प्रक्रियाओं से कांटे की हैं), इसलिए यदि यह परिवर्तन तुरंत प्रभावी करने के लिए महत्वपूर्ण है, तो सबसे आसान और सुरक्षित बात यह है कि लॉग आउट करें और वापस अंदर जाएं या रिबूट। यदि यह कोई विकल्प नहीं है या आप गहरी खुदाई करना चाहते हैं, तो यहां कुछ अन्य जवाबों में कुछ शानदार सुझाव दिए गए हैं जो आपके उपयोग के मामले के अनुकूल हो सकते हैं।


1
यह समाधान काम नहीं करता है - या मैं कुछ बुनियादी गलत समझ रहा हूं। मैं करता हूं setx JUNK Hello। नया cmd खोलें। टाइप करें echo %JUNK%और प्राप्त करें Hello। फिर मैं करता हूं REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V JUNK, और पुष्टि करता हूं कि मान रजिस्ट्री से चला गया है। मैं नए cmd टाइप करता हूं echo %JUNK%और फिर भी मिलता हूं Hello। रजिस्ट्री की खोज में 'JUNK' की कोई उपस्थिति नहीं है। कृपया मुझे बताएं कि आपको रिबूट की आवश्यकता है!
caasjj

उत्तर के लिए धन्यवाद। मैं स्टार्ट मेनू से एक नई कमांड विंडो खोल रहा हूं। मैंने कमांड के दोनों संस्करणों की कोशिश की है। वास्तव में, पहली बार जब मैं userपर्यावरण कमांड टाइप करता हूं , तो यह सफल होता है। फिर, जब मैं कमांड प्राप्त करता हूं, तो मैं उसे पुनः टाइप करता हूं The system was unable to find the specified registry or key value। इसके अलावा, JUNKरजिस्ट्री के लिए एक वैश्विक खोज के साथ regeditकुछ भी नहीं बदल जाता है। फिर भी, जब मैं एक नई कमांड विंडो खोलता हूं (स्टार्ट / एक्सेसरीज या रन में cmd.exe के माध्यम से) और टाइप करता है echo %JUNK%, तो मान अभी भी है!
caasjj

1
आह! क्या आपको लगता है कि तर्कसंगत इसके लिए है ?? मैं हमेशा जितना संभव हो उतना एडमिन से बचता हूं - UNIX / BSD / Linux परवरिश। भयानक परिश्रम के लिए एक धन्यवाद। +1
caasjj

4
शायद यह सिर्फ शब्दार्थ है, लेकिन विलोपन (रजिस्ट्री से) तुरंत प्रभाव डालता है। जब तक आप फिर से लॉग इन नहीं करते हैं, तब तक रजिस्ट्री से पर्यावरण को पुनः आरंभ नहीं किया जाता है। आप इसे वर्तमान परिवेश से हटाने के लिए 2 कमांड को जोड़ सकते हैं (जो इसे SETअगले cmd शेल के लिए सूची से हटा देगा ) और फिर इसे रजिस्ट्री से हटा दें, जैसे:SETX FOOBAR "" & REG delete HKCU\Environment /F /V FOOBAR
ल्यूक

1
रीबूट करने के बिना पर्यावरण को अपडेट नहीं होने का कारण यह है क्योंकि explorer.exe यह नहीं जानता कि यह अपडेट किया गया है। पूर्ण स्पष्टीकरण और समाधान के लिए मेरा जवाब देखें।
जेमी

72

मौजूदा कमांड सत्र से चर को स्थायी रूप से हटाने के बिना, नियमित रूप से निर्मित setकमांड का उपयोग करें - बराबर के बाद कुछ भी नहीं डालें:

set FOOBAR=

पुष्टि करने के लिए, setबिना किसी तर्क के साथ चलें और वर्तमान परिवेश की जांच करें। चर पूरी तरह से सूची से गायब होना चाहिए।

नोट : यह केवल वर्तमान वातावरण से चर को हटा देगा - यह रजिस्ट्री में परिवर्तन को जारी नहीं रखेगा। जब एक नई कमांड प्रक्रिया शुरू की जाती है, तो चर वापस आ जाएगा।


77
यह निश्चित रूप से जवाब नहीं है, और मुझे यह परेशान लगता है कि बहुत सारे वोट हैं। यह केवल वर्तमान कमांड सत्र के लिए प्रभावी है। एक नई कमांड विंडो को क्रैंक करें, और var वापस आ गया है।
15:25 बजे joescii

6
@joescii आपको यह आश्चर्यजनक लगता है? यह सवाल शीर्षक में सवाल का जवाब दिया। तो जाहिर है प्रश्न शीर्षक अधिक विशिष्ट होने की जरूरत है।
oberlies

10
@ रॉबर्टिस मैं असहमत हूं कि यह शीर्षक में सवाल का जवाब देता है, क्योंकि यह ओएस-स्तर पर काम नहीं करता है, लेकिन केवल वर्तमान कमांड विंडो में। दूसरे, आपकी बात बताती है कि प्रश्न का विवरण भाग अप्रासंगिक है।
joescii

3
@ रॉबर्टियों दुर्भाग्य से संपादित करने के लिए चाल नहीं किया है लगता है - यह अभी भी बढ़ रहा है। मुझे लगता है कि लोगों को यह उपयोगी लगता है, भले ही वह वास्तविक सवाल का जवाब नहीं देता हो, जिस स्थिति में शायद यह उत्थान के योग्य है (क्या यह?)। कम से कम इसे स्वीकार नहीं किया गया है, जो भ्रामक होगा।
क्यूपॉन्टाटे

3
मैं टिप्पणी करने वाला हूं कि मैंने क्यों अपमानित किया। जाहिर है क्योंकि यह केवल वर्तमान सत्र में काम करता है।
इयान ग्रेिंगर

22

यह काफी हद तक कवर किया गया है, लेकिन जानकारी का एक महत्वपूर्ण टुकड़ा है जो गायब है। उम्मीद है, मैं यह स्पष्ट करने में मदद कर सकता हूं कि यह कैसे काम करता है और थके हुए यात्रियों को कुछ राहत देता है। :-)

वर्तमान प्रक्रिया से हटाएं

जाहिर है, हर कोई जानता है कि आप अपनी मौजूदा प्रक्रिया से पर्यावरण चर को हटाने के लिए ऐसा करते हैं:

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" नामक एक उपयोगकर्ता पर्यावरण चर को हटाने के लिए और आपके द्वारा बाद में लॉन्च की जाने वाली प्रक्रियाओं में परिलक्षित बदलाव, निम्नलिखित करें।

  1. फ़ाइल में PowerShell स्क्रिप्ट सहेजें (हम इसे updateenv.ps1 कहेंगे)।
  2. इसे कमांड लाइन से करें: reg "HKCU \ Environment" / v FOO / f हटाएं
  3. Updateenv.ps1 चलाएं।
  4. बंद करें और अपने कमांड प्रॉम्प्ट को फिर से खोलें, और आप देखेंगे कि पर्यावरण चर अब परिभाषित नहीं है।

ध्यान दें, आपको संभवतः इस स्क्रिप्ट को चलाने की अनुमति देने के लिए अपनी PowerShell सेटिंग्स को अपडेट करना होगा, लेकिन मैं इसे आपके लिए Google-फू अभ्यास के रूप में छोड़ दूंगा।


क्या कोई विशेष कारण है कि आप खोजकर्ता को मारने और पुनः आरंभ करने की अनुशंसा नहीं करते हैं? मुझे हर व़क्त यह करना है।
प्रोमेथियस

खैर, दो हैं जो पहले दिमाग में आते हैं। पहला यह है कि बल-हत्या प्रक्रियाओं से मेमोरी लीक हो सकती है। हां, प्रक्रियाओं को रेत-बक्से माना जाता है, लेकिन यहां तक ​​कि विंडोज टास्क मैनेजर आपको हल्के ढंग से ऐसा नहीं करने की चेतावनी देता है। अन्य अधिक व्यक्तिगत कारण मेरा ओसीडी है। जब आप एक्सप्लोरर को मारते हैं और पुनः आरंभ करते हैं, तो आपके सभी चिह्न कार्य पट्टी में नीचे होते हैं, जब आप एक पर क्लिक करते हैं, तो डुप्लिकेट सहित। मैं अपने आइकनों के लिए उस क्रम में रहना पसंद करता हूं जिसमें मैंने चीजें खोलीं।
जेमी

1
वाह। मैं जिस जादुई कमांड की तलाश कर रहा हूं, वह source .bashrcविंडोज में (या उसके चचेरे भाई) की तरह काम करता है । यह मेरे लिए "रेफ़र-टू-इट" लाइन के शीर्ष पर जाता है।
बबल्डेव ०२५

18

से PowerShell आप नेट का उपयोग कर सकते [System.Environment]::SetEnvironmentVariable()विधि:

  • नाम वाले उपयोगकर्ता परिवेश चर को निकालने के लिए FOO:

    [Environment]::SetEnvironmentVariable('FOO', $null, 'User')
    

ध्यान दें कि चर $nullको हटाने के इरादे को बेहतर संकेत देने के लिए उपयोग किया जाता है , हालांकि तकनीकी रूप से यह प्रभावी रूप से ''इस मामले में गुजरने के समान है ।

  • नामित एक सिस्टम (मशीन-स्तरीय) पर्यावरण चर को हटाने के लिए FOO- उन्नयन की आवश्यकता है (व्यवस्थापक के रूप में चलाया जाना चाहिए):

    [Environment]::SetEnvironmentVariable('FOO', $null, 'Machine')
    

तेजी से निष्पादन के अलावा, reg.exe-based पद्धति का लाभ यह है कि अन्य अनुप्रयोगों को एक WM_SETTINGCHANGEसंदेश के माध्यम से परिवर्तन के बारे में सूचित किया जाता है (हालांकि सभी अनुप्रयोग उस संदेश को नहीं सुनते हैं)।


2
यह यहाँ का सबसे अच्छा जवाब है।
जेम्स

1
यह विधि रिबूटिंग की आवश्यकता से बचाती है। क्या एक सुंदर समाधान!
जॉय

13

मैं CupawnTae से सहमत हूं

SET मास्टर वातावरण में परिवर्तन के लिए उपयोगी नहीं है।

FYI करें: सिस्टम वैरिएबल HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment(यूजर वैरिएंट्स की तुलना में अच्छा सौदा है)।

FOOBAR नामक सिस्टम संस्करण के लिए पूर्ण कमांड है इसलिए:

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

(अंतरिक्ष को संभालने के लिए आवश्यक उद्धरणों पर ध्यान दें।)

यह बहुत बुरा है कि setxकमांड डिलीट सिंटैक्स का समर्थन नहीं करता है। :(

पुनश्च: जिम्मेदारी का उपयोग करें - यदि आप अपने पथ चर को मारते हैं, तो मुझे दोष मत दो!


@CMCDragonkai जो मूल प्रश्न में स्पष्ट रूप से उल्लिखित है - यह रजिस्ट्री प्रविष्टि को नहीं हटाता है, यह इसे खाली करता है। वास्तविक प्रश्न यह है कि इसे रजिस्ट्री से कैसे हटाया जाए
CupawnTae

1
मैं सिर्फ इतना जोड़ना चाहूंगा कि प्रभावी होने से पहले आपको cmd को पुनरारंभ / ताज़ा करना होगा।
जिग्गंजर

@jiggunjer, रिफ्रेश कैसे करें?
पचेरियर

@ स्पेसर सिर्फ एक नया टर्मिनल खोलते हैं।
जिगगंजर

11

डगवारे के जवाब में कमांड ने काम नहीं किया, लेकिन यह किया:

reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v FOOBAR /f

शॉर्टकट के HKLMलिए इस्तेमाल किया जा सकता है HKEY_LOCAL_MACHINE


1
इसके अलावा, उपयोगकर्ता पर्यावरण चर "HKCU \ पर्यावरण" के अंतर्गत हैं
tzrlk

1
@Tzrlk, बेमेल का क्या कारण है? यह HKLM \ Environment में क्यों नहीं है?
पेसियर

@Pacerier: मुझे नहीं पता कि उन्होंने उन्हें ऐसे पूरी तरह से अलग स्थानों पर क्यों रखा है, लेकिन अगर आप यह सुनिश्चित करना चाहते हैं कि आपने या तो / दोनों सिस्टम या / और उपयोगकर्ता चर हटा दिए हैं, तो यह जानने में मदद करता है कि वे पूरी तरह से अलग हैं स्थानों।
tzrlk

2
@Tzrlk, विंडोज साइड पर फिर से कुछ खराब डिजाइन होना चाहिए।
पचेरियर

4

रीबूटिंग के बिना हटाएं

ओपी के प्रश्न का वास्तव में बड़े पैमाने पर उत्तर दिया गया है, जिसमें पावरशेल, वायसस्क्रिप्ट के माध्यम से रिबूट करने से कैसे बचें, या आप इसे नाम देते हैं।

हालाँकि, यदि आपको केवल cmd कमांड्स से चिपके रहने की आवश्यकता है और आपके पास पॉवरशेल या वायसस्क्रिप्ट कॉल करने में सक्षम होने की विलासिता नहीं है, तो आप निम्नलिखित दृष्टिकोण का उपयोग कर सकते हैं:

rem remove from current cmd instance
  SET FOOBAR=
rem remove from the registry if it's a user variable
  REG delete HKCU\Environment /F /V FOOBAR
rem remove from the registry if it's a system variable
  REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR
rem tell Explorer.exe to reload the environment from the registry
  SETX DUMMY ""
rem remove the dummy
  REG delete HKCU\Environment /F /V DUMMY

तो यहां जादू यह है कि "सेटेक्स" का उपयोग करके एक चर को कुछ असाइन करने के लिए जिसे आपको (मेरे उदाहरण DUMMY में) की आवश्यकता नहीं है, आप Explorer.exe को रजिस्ट्री से चर को फिर से भरने के लिए मजबूर करते हैं, बिना शक्तियां की आवश्यकता के। फिर आप उस डमी को साफ करते हैं, और भले ही वह थोड़ी देर के लिए एक्सप्लोरर के वातावरण में रहेगा, यह संभवतः किसी को नुकसान नहीं पहुंचाएगा।

या यदि चर हटाने के बाद आपको नए सेट करने की आवश्यकता है, तो आपको किसी डमी की आवश्यकता भी नहीं है। नए वेरिएबल्स को सेट करने के लिए SETX का उपयोग करने से आपके द्वारा शुरू किए गए किसी भी नए cmd कार्यों से आपके द्वारा हटाए गए स्वतः ही साफ हो जाएंगे।

पृष्ठभूमि की जानकारी: मैंने मौजूदा सीएमडी स्क्रिप्ट को संशोधित करके अपनी नौकरी के सभी कंप्यूटरों पर एक ही नाम के सिस्टम चर द्वारा उपयोगकर्ता चर के एक सेट को बदलने के लिए सफलतापूर्वक इस दृष्टिकोण का उपयोग किया। इसे मैन्युअल रूप से करने के लिए बहुत सारे कंप्यूटर हैं, और न ही उन सभी के लिए अतिरिक्त शक्तियां या vbscripts की नकल करना व्यावहारिक था। सिस्टम वेरिएबल्स के साथ उपयोगकर्ता को बदलने के लिए मुझे तत्काल कारण की आवश्यकता थी कि उपयोगकर्ता चर रोमिंग प्रोफाइल (उस बारे में नहीं सोचते) में सिंक्रनाइज़ हो जाते हैं, इसलिए एक ही विंडोज़ लॉगिन का उपयोग करने वाली कई मशीनें लेकिन विभिन्न मूल्यों की आवश्यकता होती है, मिश्रित हो गई।


3
setx FOOBAR ""

बस FOOBAR का मान अशक्त होने का कारण बनता है। (हालांकि, यह साथ दिखाता हैset कमांड के साथ है "" इसलिए शायद डबल-कोट्स स्ट्रिंग है।)

मैंनें इस्तेमाल किया:

set FOOBAR=

और फिर FOOBAR को अब सेट कमांड में सूचीबद्ध नहीं किया गया था। (लॉग-ऑफ की आवश्यकता नहीं थी।)

विंडोज 7 32 बिट, कमांड प्रॉम्प्ट का उपयोग करके, गैर-प्रशासक वही है जो मैंने उपयोग किया है। (सीएमडी या Windows+ नहींR , जो अलग हो सकता है।)

BTW, मैंने अपने द्वारा बनाए गए चर को रजिस्ट्री में कहीं भी नहीं देखा था। मैं RegEdit का उपयोग व्यवस्थापक के रूप में नहीं कर रहा हूँ ।


1

आप एक छोटी सी VBScript स्क्रिप्ट भी बना सकते हैं :

Set env = CreateObject("WScript.Shell").Environment("System")
If env(WScript.Arguments(0)) <> vbNullString Then env.Remove WScript.Arguments(0)

फिर इसे कॉल करें %windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR

नुकसान आपको एक अतिरिक्त स्क्रिप्ट की आवश्यकता है, लेकिन इसे रिबूट की आवश्यकता नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.