Cmd.exe से लगातार पर्यावरण चर सेट करें


123

मुझे अलग-अलग विंडो मशीनों पर पर्यावरण चर सेट करना होगा, लेकिन मैं "माई कंप्यूटर" के गुणों की स्क्रीन पर जाकर मैन्युअल रूप से उन्हें बदलने से परेशान नहीं होना चाहता

मैं कमांड लाइन से एक बैच फ़ाइल के साथ करना चाहता हूं। जहां तक ​​मैं समझता हूं, सेट का उपयोग केवल उन प्रक्रियाओं के लिए चर को बदल देगा, जिन्हें मैं कमांड विंडो में कॉल करूंगा।

मैं इसे निश्चित रूप से सेट करना चाहता हूं, इसलिए बाद में, एक नई प्रक्रिया चलाने के दौरान, यह उन नई सेटिंग्स का उपयोग करेगा जो मैंने सेट किया है। क्या कमांड लाइन से ऐसा करने का कोई तरीका है?


यदि वे स्थायी जा रहे हैं, तो उन्हें कमांड लाइन से सेट करने का बिंदु क्या है? आप इसे फिर से करने की जरूरत नहीं है।
d-live

12
हां, लेकिन मुझे इसे कई कंप्यूटरों पर करना होगा, इसलिए स्क्रिप्ट को चलाने से मुझे कुछ समय की बचत होगी।
आर्थर

2
ठीक है, उस स्थिति में आप अपना कंप्यूटर एक कंप्यूटर पर सेट कर सकते हैं और नीचे वर्णित प्रविष्टियों का निर्यात कर सकते हैं और एक। Reg फ़ाइल है, अगर SETX आपके लिए उपलब्ध नहीं है।
d-live

यही मैंने किया है। धन्यवाद।
आर्थर

1
RE: 'उन्हें कमांड लाइन से सेट करने का बिंदु ...' जहां मैं काम करता हूं, सॉफ्टवेयर के विभिन्न संस्करणों का परीक्षण / विकास करने के लिए विभिन्न मूल्यों के लिए लगातार पर्यावरण चर की एक निरंतर आवश्यकता होती है। लाइसेंसिंग का मतलब है कि इसे किसी अन्य तरीके से नहीं किया जा सकता है (जैसे कि वीएम चलाना) इसलिए हमारा एकमात्र सहारा बैच स्क्रिप्ट में SETX का उपयोग करना है। .Reg का उपयोग करना दस्तावेज़ के लिए इसकी कठिनता के रूप में कम अच्छा है / यह देखें कि क्या चल रहा है
टोनी ईस्टवुड

जवाबों:


189

Cmd विंडो बंद होने के बाद बने रहने वाले वेरिएबल को सेट करने के लिए SETX कमांड ('x' प्रत्यय पर ध्यान दें) का प्रयोग करें।

उदाहरण के लिए, "बार" के मान के साथ एक env var "foo" सेट करने के लिए:

setx foo bar

हालाँकि यह 'नोट्स' पढ़ने लायक है जो यदि आप setx /?विशेष रूप से उपयोग ( ) प्रिंट करते हैं तो प्रदर्शित होते हैं :

2) एक स्थानीय प्रणाली पर, इस उपकरण द्वारा बनाए गए या संशोधित किए गए चर भविष्य के कमांड विंडो में उपलब्ध होंगे, लेकिन वर्तमान सीएमडी। Exe कमांड विंडो में नहीं।

3) एक दूरस्थ प्रणाली पर, इस उपकरण द्वारा बनाए गए या संशोधित किए गए चर अगले लॉगऑन सत्र में उपलब्ध होंगे।

PowerShell में, [पर्यावरण] :: SetEnvironmentVariable कमांड।


ऐसा लगता है कि SETX केवल विंडोज़ XP SP2
आर्थर

2
इसने मेरे लिए विंडोज 7 पर काम किया। आप विंडोज के किस संस्करण का उपयोग कर रहे हैं?
विक डेविड

@ जूल्स: आप इसे रिसोर्स किट से प्राप्त कर सकते हैं।
जॉय

46
SETX के साथ ध्यान रखें, यह आपकी चर लंबाई को 1024 char तक काट देता है ...% path% में हेरफेर करते समय बहुत खतरनाक होता है।
एटिएन देसगैने 17

2
पावर शेल के साथ [Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine"), आप बस देख सकते हैं , msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx
ग्रैडिएंट

21

वातावरण चर के लिए MSDN प्रलेखीकरण आपको बताता है कि क्या करना है:

प्रोग्रामेटिक रूप से सिस्टम वातावरण चर जोड़ने या संशोधित करने के लिए, उन्हें HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment रजिस्ट्री कुंजी में जोड़ें, फिर स्ट्रिंग "पर्यावरण" के लिए lParam सेट पर WM_SETTINGCHANGE संदेश प्रसारित करें । यह आपके अपडेट लेने के लिए शेल जैसे एप्लिकेशन को अनुमति देता है।

आपको निश्चित रूप से ऐसा करने के लिए व्यवस्थापक अधिकारों की आवश्यकता होगी। मुझे विंडोज बैच से विंडोज़ संदेश प्रसारित करने का कोई तरीका नहीं पता है, इसलिए आपको ऐसा करने के लिए एक छोटा प्रोग्राम लिखने की आवश्यकता होगी।


1
ठीक है, इसलिए आपके समाधान पर विचार करते हुए, मैंने एक रजिस्ट्री (.reg) फ़ाइल बनाई है जिसमें पर्यावरण चर हैं जिन्हें मैं जोड़ना / बदलना चाहता हूं। फिर मैं इस फाइल को सभी लक्षित पीसी पर चलाऊंगा। मुझे वास्तव में एक विंडोज़ संदेश भेजने की आवश्यकता नहीं है, क्योंकि मैं सिर्फ उस एप्लिकेशन को पुनः आरंभ करूंगा जो प्रभावित होगा। धन्यवाद।
आर्थर

1
मैं आपके दूसरे उत्तर को यहाँ जोड़ रहा हूँ, क्योंकि जब मैं इस प्रश्न पर ठोकर खा रहा था, तब ठीक वैसा ही था जैसा मैं देख रहा था: stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck

1
@ डेविड, तो setxनीचे क्यों नहीं ?
पचेरियर

मुझे लगता है कि इस reg को
ट्रंकटिंग

2
' SetVar.vbs
Sub sety(wsh, action, typey, vary, value)
  Dim wu
  Set wu = wsh.Environment(typey)
  wui = wu.Item(vary)
  Select Case action
    Case "ls"
      WScript.Echo wui
    Case "del"
      On Error Resume Next
      wu.remove(vary)
      On Error Goto 0
    Case "set"
      wu.Item(vary) = value
    Case "add"
      If wui = "" Then
        wu.Item(vary) = value
      ElseIf InStr(UCase(";" & wui & ";"), UCase(";" & value & ";")) = 0 Then
        wu.Item(vary) = value & ";" & wui
      End If
    Case Else
      WScript.Echo "Bad action"
  End Select
End Sub

Dim wsh, args
Set wsh = WScript.CreateObject("WScript.Shell")
Set args = WScript.Arguments
Select Case WScript.Arguments.Length
  Case 3
    value = ""
  Case 4
    value = args(3)
  Case Else
    WScript.Echo "Arguments - 0: ls,del,set,add; 1: user,system, 2: variable; 3: value"
    value = "```"
End Select
If Not value = "```" Then
  ' 0: ls,del,set,add; 1: user,system, 2: variable; 3: value
  sety wsh, args(0), args(1), UCase(args(2)), value
End If

21
आपको अपने कोड के साथ कुछ संदर्भ या स्पष्टीकरण जोड़ने पर विचार करना चाहिए।
अदमुनसन

1
कोड 1 का शक्तिशाली टुकड़ा। XP पर काम करता है setx(और इसे स्थापित करने की संभावना के बिना)। सरल प्रयोग (मेरे मामले में):wsh.Environment("user").Item("myVar") = "my value"
मेराक

2
चूंकि किसी ने भी परेशानी नहीं ली है, एक्सपी (कोई संसाधन किट या सेटेक्स आवश्यक) पर उपयोग करने के लिए, सभी (अन्य) डॉस खिड़कियों के लिए {सेट फू = बार} को पूरा करने के लिए: 1. सेट वीवर के रूप में उपरोक्त कोड को सहेजें 2. सेटवर। vbs सेट सिस्टम फू "बार" नोट, वर्तमान डॉस विंडो को इससे FOO नहीं मिलता है। इश्यू सेट फू = बार को प्राप्त करने के लिए
MicrosoftShouldBeKickedInNuts

2
ध्यान दें, यह रिबूट से बचता है (जब आप सिस्टम parm का उपयोग करते हैं)
MicrosoftShouldBeKickedInNuts

1

वास्तव में सेट TEST_VARIABLE = मान केवल वर्तमान प्रक्रिया के लिए काम करता है, इसलिए SETXइसकी आवश्यकता है। उपयोगकर्ता स्तर पर पर्यावरण चर को स्थायी रूप से संग्रहीत करने के लिए एक त्वरित उदाहरण।

  1. Cmd में, SETX TEST_VARIABLE etcअभी तक लागू नहीं हुआ ( echo %TEST_VARIABLE%दिखाता है %TEST_VARIABLE%,
  2. त्वरित जांच: खुला cmd, echo %TEST_VARIABLE%दिखाता है etc
  3. GUI जाँच: सिस्टम गुण -> उन्नत -> पर्यावरण चर -> उपयोगकर्ता चर -> के लिए आपको मूल्य के साथ चर TEST_VARIABLE देखना चाहिए etc

0
:: Sets environment variables for both the current `cmd` window 
::   and/or other applications going forward.
:: I call this file keyz.cmd to be able to just type `keyz` at the prompt 
::   after changes because the word `keys` is already taken in Windows.

@echo off

:: set for the current window
set APCA_API_KEY_ID=key_id
set APCA_API_SECRET_KEY=secret_key
set APCA_API_BASE_URL=https://paper-api.alpaca.markets

:: setx also for other windows and processes going forward
setx APCA_API_KEY_ID     %APCA_API_KEY_ID%
setx APCA_API_SECRET_KEY %APCA_API_SECRET_KEY%
setx APCA_API_BASE_URL   %APCA_API_BASE_URL%

:: Displaying what was just set.
set apca

:: Or for copy/paste manually ...
:: setx APCA_API_KEY_ID     'key_id'
:: setx APCA_API_SECRET_KEY 'secret_key'
:: setx APCA_API_BASE_URL   'https://paper-api.alpaca.markets'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.