विंडोज कमांड लाइन से स्थायी रूप से पैठ चर को कैसे अपडेट करें?


122

अगर मैं set PATH=%PATH%;C:\\Something\\binकमांड लाइन ( cmd.exe) से निष्पादित करता echo %PATH%हूं और फिर निष्पादित करता हूं तो मुझे यह स्ट्रिंग PATH में दिखाई देती है। यदि मैं कमांड लाइन को बंद और खोलता हूं, तो वह नया स्ट्रिंग PATH में नहीं है।

मैं भविष्य में सभी प्रक्रियाओं के लिए कमांड लाइन से स्थायी रूप से कैसे अपडेट कर सकता हूं, न कि केवल वर्तमान प्रक्रिया के लिए?

मैं सिस्टम प्रॉपर्टीज → एडवांस्ड → एनवायरनमेंटल वैरिएबल पर जाकर ऐसा नहीं करना चाहता और वहां पैथ को अपडेट कर सकता हूं।

इस आदेश को जावा एप्लिकेशन से निष्पादित किया जाना चाहिए (कृपया मेरे अन्य प्रश्न देखें )।


5
शक्तियों का उपयोग करके, यह काफी सीधा है stackoverflow.com/questions/714877/… । Cmd का उपयोग करना, मुझे यकीन नहीं है। आपको रजिस्ट्री को संशोधित करना होगा या किसी भी तरह से .net असेंबली में खींचना होगा।
ऑस्टेन होम्स

1
जैसा कि मैंने कहा, मुझे यह जावा एप्लिकेशन के भीतर से करना है। मैंने सोचा कि कुछ cmd कमांड useng javaRuntime.getRuntime().exec("my command");
vale4674

जवाबों:


43

यह करने के लिए प्रलेखन MSDN पर पाया जा सकता है । मुख्य उद्धरण यह है:

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

ध्यान दें कि इस कुंजी को संशोधित करने में सक्षम होने के लिए आपके आवेदन को उन्नत व्यवस्थापक अधिकारों की आवश्यकता होगी।

आप टिप्पणियों में इंगित करते हैं कि आप प्रति-उपयोगकर्ता वातावरण को संशोधित करने में प्रसन्न होंगे। HKEY_CURRENT_USER \ पर्यावरण में मानों को संपादित करके ऐसा करें । पहले की तरह, सुनिश्चित करें कि आपने एक WM_SETTINGCHANGEसंदेश प्रसारित किया है ।

आप जेएनआई रजिस्ट्री कक्षाओं का उपयोग करके आसानी से अपने जावा एप्लिकेशन से ऐसा करने में सक्षम होना चाहिए।


1
हां, जेएनआई रजिस्ट्री कक्षाओं का उपयोग करना। एक बड़ा मुद्दा यह है कि आपका ऐप संभवतः उन्नत नहीं है। क्या आप जानते हैं कि यह कैसे करना है? यदि आप केवल अपने ऐप के एक छोटे से हिस्से को ऊंचा चलाना चाहते हैं (यानी सिर्फ इस बदलाव को करने के लिए) तो सबसे सरल उपाय है नौकरी करने के लिए एक बहुत ही सरल C ++ ऐप, जो ऐप प्रकट के साथ चिह्नित है, और फिर एक अलग प्रक्रिया के रूप में निष्पादित किया जाता है जो UAC डायलॉग को उकसाता है।
डेविड हेफर्नन डिक

1
आप HKEY_CURRENT_USER\Environmentउन्नयन की आवश्यकता से बचने के लिए संपादन भी कर सकते हैं।
किचन डिक

@ डेविड हेफर्नन हां केवल इस चीज को ऊंचा चलाना है। तो आपका सुझाव यह है कि C ++ एप्लिकेशन लिखें और इसे मेरे जावा एप्लिकेशन से निष्पादित करें? क्या आप मुझे ऐसा करने के लिए कुछ उदाहरण कोड या लिंक प्रदान कर सकते हैं?
vale4674

हां। जैसा डेविड ने कहा। केवल आप उत्थान नहीं करते हैं। मुझे यह भी उल्लेख करना चाहिए कि यह केवल वर्तमान उपयोगकर्ता के लिए पर्यावरण को संशोधित करेगा।
किचन

आपको इसे एक अलग प्रक्रिया में अलग करने की आवश्यकता है ताकि आप केवल सिस्टम पथ को संशोधित करते समय एक यूएसी संवाद को बाध्य कर सकें। यह बस कुछ रजिस्ट्री पढ़ने और लिखने के साथ एक सरल C ++ एप्लिकेशन की जरूरत है, एक SendMessage द्वारा पीछा किया। सेट requestedExecutionLevelकरने के लिए requireAdministratorएप्लिकेशन मेनिफ़ेस्ट के।
डेविड हेफर्नन 15

145

आप उपयोग कर सकते हैं:

setx PATH "%PATH%;C:\\Something\\bin"

हालाँकि, setxसंग्रहित स्ट्रिंग को 1024 बाइट्स में काट देगा, संभवतः PATH को दूषित कर देगा।

/Mके बदले PATHमें बदल जाएगा । दूसरे शब्दों में, उपयोगकर्ता के बजाय एक सिस्टम चर। उदाहरण के लिए:HKEY_LOCAL_MACHINEHKEY_CURRENT_USER

SETX /M PATH "%PATH%;C:\your path with spaces"

आपको ध्यान रखना होगा, नया PATH आपके करंट में दिखाई नहीं दे रहा है cmd.exe

लेकिन अगर आप रजिस्ट्री में देखते हैं या आप के cmd.exeसाथ एक "set p"नया मूल्य देख सकते हैं।


2
क्या उपयोगकर्ता setxके पथ के बजाय मशीन के पथ को बदलने के लिए उपयोग करने का कोई तरीका है ?
कोरी ओगबर्न

4
से यहाँ आपको बता सकता है यह का उपयोग करके वर्तमान में उपयोगकर्ता के प्रवेश के लिए, लेकिन मशीन के लिए न केवल एक चर सेट करने के लिए संभव हो सकता है /mऔर आदेश के अंत में, पर Windows XP 7. मैं हालांकि यह प्रयास नहीं किया है।
पन्ना

1
setxकमांड चलाते समय मुझे त्रुटि मिली "डिफ़ॉल्ट विकल्प '2' समय से अधिक की अनुमति नहीं है" इसे कैसे बाईपास किया जाए?
नाम जी वीयू

12
@KilgoreCod टिप्पणियां: मैं आदेश का उपयोग कर के खिलाफ चेतावनी देते हैं: इन दिनों कई (? सबसे) प्रतिष्ठानों पर पथ चर लंबा होगा - setx 1024 बाइट में संग्रहीत स्ट्रिंग को काटना होगा, संभावित पथ भ्रष्ट (चर्चा यहाँ देख superuser.com/ q / 812754 )।
बेर्स्फोर्ड

2
मैं उस पथ को प्रतिध्वनित करने की कोशिश करता हूं जो पहले से ही 1200bytes से अधिक का है। सेटक्स के बजाय कोई अन्य तरीका?
लॉफटॉग

37

मैं कमांड का उपयोग करने के खिलाफ चेतावनी देता हूं

setx PATH "%PATH%;C:\Something\bin"

इसके कार्यान्वयन की "सुविधा" के कारण पाथ चर को संशोधित करने के लिए। इन दिनों कई (सबसे?) इंस्टॉलेशन पर चर लम्बा setxहोगा - संग्रहीत स्ट्रिंग को 1024 बाइट्स तक काट देगा, संभवतः PATH को दूषित कर रहा है ( यहां चर्चा देखें )।

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


9

यह पायथन-लिपि [*] ठीक यही करता है:

"""
Show/Modify/Append registry env-vars (ie `PATH`) and notify Windows-applications to pickup changes.

First attempts to show/modify HKEY_LOCAL_MACHINE (all users), and 
if not accessible due to admin-rights missing, fails-back 
to HKEY_CURRENT_USER.
Write and Delete operations do not proceed to user-tree if all-users succeed.

Syntax: 
    {prog}                  : Print all env-vars. 
    {prog}  VARNAME         : Print value for VARNAME. 
    {prog}  VARNAME   VALUE : Set VALUE for VARNAME. 
    {prog}  +VARNAME  VALUE : Append VALUE in VARNAME delimeted with ';' (i.e. used for `PATH`). 
    {prog}  -VARNAME        : Delete env-var value. 

Note that the current command-window will not be affected, 
changes would apply only for new command-windows.
"""

import winreg
import os, sys, win32gui, win32con

def reg_key(tree, path, varname):
    return '%s\%s:%s' % (tree, path, varname) 

def reg_entry(tree, path, varname, value):
    return '%s=%s' % (reg_key(tree, path, varname), value)

def query_value(key, varname):
    value, type_id = winreg.QueryValueEx(key, varname)
    return value

def yield_all_entries(tree, path, key):
    i = 0
    while True:
        try:
            n,v,t = winreg.EnumValue(key, i)
            yield reg_entry(tree, path, n, v)
            i += 1
        except OSError:
            break ## Expected, this is how iteration ends.

def notify_windows(action, tree, path, varname, value):
    win32gui.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment')
    print("---%s %s" % (action, reg_entry(tree, path, varname, value)), file=sys.stderr)

def manage_registry_env_vars(varname=None, value=None):
    reg_keys = [
        ('HKEY_LOCAL_MACHINE', r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'),
        ('HKEY_CURRENT_USER', r'Environment'),
    ]
    for (tree_name, path) in reg_keys:
        tree = eval('winreg.%s'%tree_name)
        try:
            with winreg.ConnectRegistry(None, tree) as reg:
                with winreg.OpenKey(reg, path, 0, winreg.KEY_ALL_ACCESS) as key:
                    if not varname:
                        for regent in yield_all_entries(tree_name, path, key):
                            print(regent)
                    else:
                        if not value:
                            if varname.startswith('-'):
                                varname = varname[1:]
                                value = query_value(key, varname)
                                winreg.DeleteValue(key, varname)
                                notify_windows("Deleted", tree_name, path, varname, value)
                                break  ## Don't propagate into user-tree.
                            else:
                                value = query_value(key, varname)
                                print(reg_entry(tree_name, path, varname, value))
                        else:
                            if varname.startswith('+'):
                                varname = varname[1:]
                                value = query_value(key, varname) + ';' + value
                            winreg.SetValueEx(key, varname, 0, winreg.REG_EXPAND_SZ, value)
                            notify_windows("Updated", tree_name, path, varname, value)
                            break  ## Don't propagate into user-tree.
        except PermissionError as ex:
            print("!!!Cannot access %s due to: %s" % 
                    (reg_key(tree_name, path, varname), ex), file=sys.stderr)
        except FileNotFoundError as ex:
            print("!!!Cannot find %s due to: %s" % 
                    (reg_key(tree_name, path, varname), ex), file=sys.stderr)

if __name__=='__main__':
    args = sys.argv
    argc = len(args)
    if argc > 3:
        print(__doc__.format(prog=args[0]), file=sys.stderr)
        sys.exit()

    manage_registry_env_vars(*args[1:])

नीचे कुछ उपयोग उदाहरण हैं, यह मानते हुए कि यह setenv.pyआपके वर्तमान पथ में कहीं फ़ाइल में सहेजा गया है । ध्यान दें कि इन उदाहरणों में मेरे पास व्यवस्थापक-अधिकार नहीं थे , इसलिए परिवर्तन केवल मेरे स्थानीय उपयोगकर्ता के रजिस्ट्री ट्री को प्रभावित करते हैं:

> REM ## Print all env-vars
> setenv.py
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session   Manager\Environment:PATH due to: [WinError 5] Access is denied
HKEY_CURRENT_USER\Environment:PATH=...
...

> REM ## Query env-var:
> setenv.py PATH C:\foo
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session   Manager\Environment:PATH due to: [WinError 5] Access is denied
!!!Cannot find HKEY_CURRENT_USER\Environment:PATH due to: [WinError 2] The system cannot find the file specified

> REM ## Set env-var:
> setenv.py PATH C:\foo
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session   Manager\Environment:PATH due to: [WinError 5] Access is denied
---Set HKEY_CURRENT_USER\Environment:PATH=C:\foo

> REM ## Append env-var:
> setenv.py +PATH D:\Bar
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session   Manager\Environment:PATH due to: [WinError 5] Access is denied
---Set HKEY_CURRENT_USER\Environment:PATH=C:\foo;D:\Bar

> REM ## Delete env-var:
> setenv.py -PATH
!!!Cannot access HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session   Manager\Environment:PATH due to: [WinError 5] Access is denied
---Deleted HKEY_CURRENT_USER\Environment:PATH

[*] से लिया गया: http://code.activestate.com/recipes/416087-persistent-environment-variables-on-windows/


4

संदर्भ उद्देश्य के लिए, किसी को भी कोड के माध्यम से रास्ता बदलने की खोज करने के लिए, मैं इस वेब पेज से डेल्फी प्रोग्रामर द्वारा एक उपयोगी पोस्ट उद्धृत कर रहा हूं: http://www.tek-tips.com/viewthread.cfm?qid=686382

टोनहु (प्रोग्रामर) 22 अक्टूबर 03 17:57 मैंने पाया कि मैंने मूल पोस्टिंग कहाँ पढ़ी है, यह यहाँ है: http://news.jrsoftware.org/news/innosetup.isx/msg02129 ....

आपको इसकी आवश्यकता के अंश इस प्रकार हैं:

आपको LParam में स्ट्रिंग "पर्यावरण" निर्दिष्ट करना होगा। डेल्फी में आप इसे इस तरह से करेंगे:

 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));

यह जॉर्डन रसेल, http://www.jrsoftware.org , (एओ) इनोसेटअप के लेखक द्वारा सुझाया गया था , ("इनो सेटअप विंडोज प्रोग्राम के लिए एक नि: शुल्क इंस्टॉलर है। पहली बार 1997 में शुरू किया गया था, इनो सेटअप आज प्रतिद्वंद्वियों और यहां तक ​​कि कई से आगे निकल जाता है। सुविधा सेट और स्थिरता में वाणिज्यिक इंस्टॉलर। ") (मैं सिर्फ और अधिक लोगों को इनोसेटअप का उपयोग करना चाहूंगा)

HTH


आपको रजिस्ट्री को संशोधित करना होगा। साथ ही, इंटेगर का कलाकार खराब है। 64 बिट संगतता के बजाय LPARAM को कास्ट करें।
डेविड हेफर्नन


4

एक कॉर्पोरेट नेटवर्क में, जहां उपयोगकर्ता के पास केवल सीमित पहुंच है और पोर्टेबल एप्लिकेशन का उपयोग करता है, ये कमांड लाइन ट्रिक हैं:

  1. उपयोगकर्ता env चर क्वेरी reg query "HKEY_CURRENT_USER\Environment":। "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"LOCAL_MACHINE का उपयोग करें ।
  2. नया उपयोगकर्ता env वैरिएबल जोड़ें reg add "HKEY_CURRENT_USER\Environment" /v shared_dir /d "c:\shared" /t REG_SZ:। REG_EXPAND_SZअन्य %% चर वाले रास्तों के लिए उपयोग करें ।
  3. मौजूदा env वैरिएबल को हटाएं reg delete "HKEY_CURRENT_USER\Environment" /v shared_dir:।

3

यह स्क्रिप्ट http://www.autohotkey.com/board/topic/63210-modify-system-path-gui/

सभी आवश्यक विंडोज एपीआई कॉल शामिल हैं जो आपकी आवश्यकताओं के लिए फिर से तैयार की जा सकती हैं। यह वास्तव में एक AutoHotkey GUI है जो सिस्टम पथ को आसानी से बदल सकता है। एक प्रशासक के रूप में चलाने की आवश्यकता है।


प्रश्न पढ़ें। फिर।
जिगगंजर

महान स्क्रिप्ट। मैं HotKey का उपयोग करता हूं, लेकिन यह नहीं जानता कि मुझे इसमें स्क्रिप्ट जोड़ने के लिए कैसे या क्या करने की आवश्यकता है। क्या आप मदद की पेशकश कर सकते हैं, एक लिंक प्रदान कर सकते हैं या समझा सकते हैं कि क्या किया जाना चाहिए?
jwzumwalt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.