উইন্ডোজ কমান্ড লাইন থেকে PATH পরিবর্তনশীল স্থায়ীভাবে কীভাবে আপডেট করবেন?


122

যদি আমি set PATH=%PATH%;C:\\Something\\binকমান্ড লাইন ( cmd.exe) থেকে নির্বাহ echo %PATH%করি এবং তারপরে কার্যকর করি তবে আমি এই স্ট্রিংটি PATH- র সাথে যুক্ত দেখতে পাচ্ছি। আমি যদি কমান্ড লাইনটি বন্ধ এবং খুলি, তবে নতুন স্ট্রিং PATH এ নেই।

আমি কেবল বর্তমান প্রক্রিয়াটির জন্য নয়, ভবিষ্যতে সমস্ত প্রক্রিয়ার জন্য কমান্ড লাইন থেকে স্থায়ীভাবে কীভাবে PATH আপডেট করতে পারি?

সিস্টেম প্রোপার্টি। অ্যাডভান্সড vari এনভায়রনমেন্ট ভেরিয়েবলগুলিতে গিয়ে সেখানে PATH আপডেট করে আমি এটি করতে চাই না।

এই কমান্ডটি অবশ্যই একটি জাভা অ্যাপ্লিকেশন থেকে কার্যকর করা উচিত (দয়া করে আমার অন্যান্য প্রশ্নটি দেখুন )।


5
PowerShell ব্যবহার করে এটা মোটামুটি হতে হচ্ছে stackoverflow.com/questions/714877/... । সিএমডি ব্যবহার করে, আমি নিশ্চিত নই। আপনাকে রেজিস্ট্রিটি সংশোধন করতে হবে বা কোনওভাবে। নেট সমাবেশে টানতে হবে।
অস্টেন হোমস

1
আমি যেমন বলেছি, জাভা অ্যাপ্লিকেশনটির মধ্যে থেকে আমাকে এটি করতে হবে। আমি ভেবেছিলাম মাত্র কিছু সেমিডি কমান্ড ইউজ জাভা ব্যবহার করবRuntime.getRuntime().exec("my command");
vale4674

উত্তর:


43

এটি কীভাবে করবেন সে সম্পর্কে ডকুমেন্টেশনগুলি এমএসডিএন- তে পাওয়া যাবে । মূল এক্সট্রাক্টটি হ'ল:

প্রোগ্রামগতভাবে সিস্টেম এনভায়রনমেন্ট ভেরিয়েবলগুলি যুক্ত বা সংশোধন করতে, তাদেরকে HKEY_LOCAL_MACHINE \ সিস্টেম \ কারেন্টকন্ট্রোলসেট \ নিয়ন্ত্রণ \ সেশন ম্যানেজার \ পরিবেশ রেজিস্ট্রি কীতে যুক্ত করুন, তারপরে WM_SETTINGCHANGE"পরিবেশ" স্ট্রিংটিতে এলপামের সাহায্যে একটি বার্তা সম্প্রচার করুন । এটি শেল এর মতো অ্যাপ্লিকেশনগুলিকে আপনার আপডেটগুলি তুলতে অনুমতি দেয়।

নোট করুন যে এই অ্যাপ্লিকেশনটির এই কীটি সংশোধন করতে সক্ষম হতে উন্নত প্রশাসকের অধিকারের প্রয়োজন হবে।

আপনি মন্তব্যগুলিতে ইঙ্গিত করেছেন যে আপনি প্রতি ব্যবহারকারী পরিবেশকে কেবল পরিবর্তন করতে খুশি হবেন। HKEY_CURRENT_USER \ পরিবেশে মানগুলি সম্পাদনা করে এটি করুন । আগের মতো, নিশ্চিত হয়ে নিন যে আপনি কোনও WM_SETTINGCHANGEবার্তা সম্প্রচার করেছেন।

আপনার জাভা অ্যাপ্লিকেশন থেকে জেএনআই রেজিস্ট্রি ক্লাসগুলি ব্যবহার করে খুব সহজেই এটি করা উচিত।


1
হ্যাঁ, জেএনআই রেজিস্ট্রি ক্লাস ব্যবহার করে। আরও বড় সমস্যাটি হ'ল আপনার অ্যাপটি সম্ভবত এলিভেটেড চলবে না। আপনি এটি জানেন যে এটি করতে কিভাবে? যদি আপনি কেবল আপনার অ্যাপ্লিকেশনটির একটি ছোট অংশই এলিভেটেড চালাতে চান (যেমন কেবল এই পরিবর্তনটি করতে চান) তবে সহজ সমাধানটি কাজটি করার জন্য একটি খুব সাধারণ সি ++ অ্যাপ্লিকেশন, অ্যাপ ম্যানিফেস্টের সাথে চিহ্নিত এবং তারপরে একটি পৃথক প্রক্রিয়া হিসাবে কার্যকর করা হয় যা ইউএসি ডায়লগকে উস্কে দেয়।
ডেভিড হেফারনান

1
HKEY_CURRENT_USER\Environmentউন্নয়নের প্রয়োজনীয়তা এড়াতে আপনি সম্পাদনা করতে পারেন ।
কিচিক

@ ডেভিড হেফারনান হ্যাঁ কেবল এই জিনিসটিকেই উন্নত করতে হবে। সুতরাং আপনার পরামর্শটি সি ++ অ্যাপ্লিকেশনটি লিখতে হবে এবং এটি আমার জাভা অ্যাপ্লিকেশন থেকে কার্যকর করা যাবে? আপনি কীভাবে আমাকে কিছু উদাহরণ কোড বা লিঙ্ক সরবরাহ করতে পারেন?
vale4674

হাঁ। ডেভিড যেমন বলেছেন। কেবল আপনিই উন্নতি করবেন না। আমার এটিও উল্লেখ করা উচিত যা এটি কেবলমাত্র বর্তমান ব্যবহারকারীর জন্য পরিবেশ পরিবর্তন করবে।
কিচিক

আপনাকে এটিকে একটি পৃথক প্রক্রিয়াতে আলাদা করতে হবে যাতে সিস্টেম প্যাথটি সংশোধন করার সময় আপনি কেবল একটি ইউএসি ডায়ালগকে বাধ্য করেন। এটিতে কেবল কয়েকটি সাধারণ রেজিস্ট্রি পড়তে এবং লেখার সাথে একটি সি সি ++ অ্যাপ্লিকেশন প্রয়োজন, তার পরে একটি সেন্ডম্যাসেজ হয়। সেট requestedExecutionLevelথেকে requireAdministratorঅ্যাপ্লিকেশন ম্যানিফেস্টে।
ডেভিড হেফারনান

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এবং কমান্ড শেষে, উপর উইন্ডোজ এক্সপি 7. আমি যদিও এটা চেষ্টা করেন নি।
প্যানি 20'13

1
setxকমান্ড "ডিফল্ট বিকল্পটি '2' সময়ের চেয়ে বেশি অনুমোদিত নয়" এটিকে চালিয়ে যাওয়ার সময় আমি ত্রুটি পেয়েছি ?
নাম জি ভিইউ

12
@KilgoreCod মন্তব্য: আমি কমান্ড ব্যবহারের বিরুদ্ধে সাবধান: এই দিন অনেক (? অধিকাংশ) ইনস্টলেশনের উপর পাথ পরিবর্তনশীল লম্বা হবে - setx 1024 বাইট সঞ্চিত স্ট্রিং অগ্রভাগ ছাঁটিয়া হবে, সম্ভাব্য পাথ corrupting (আলোচনা এখানে দেখতে superuser.com/ কিউ / 812754 )।
বেরেসফোর্ড

2
আমি ইতিমধ্যে 1200 বাইট এরও বেশি পথটি প্রতিধ্বনিত করার চেষ্টা করছি। সেটেক্সের পরিবর্তে অন্য কোনও উপায়?
আইনফোটোগ

37

কমান্ডটি ব্যবহার করা সম্পর্কে সতর্কতা অবলম্বন করছি

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

PATH ভেরিয়েবলটি কার্যকর করার কারণ এটির প্রয়োগের একটি "বৈশিষ্ট্য" রয়েছে। আজকের দিনে (বেশিরভাগ?) ইনস্টলেশনগুলিতে ভেরিয়েবল দীর্ঘ setxহবে - সঞ্চিত স্ট্রিংটি 1024 বাইটে কেটে যাবে, সম্ভাব্যভাবে PATH কে ক্ষতিগ্রস্থ করবে ( এখানে আলোচনা দেখুন )।

( আমি এই ইস্যুটি পতাকাঙ্কিত করার জন্য বিশেষভাবে সাইন আপ করেছি, এবং তাই 2 শে '12 '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 ....

আপনার যা প্রয়োজন হবে তার একটি অংশ:

আপনার অবশ্যই এলপিরামের "পরিবেশ" স্ট্রিংটি নির্দিষ্ট করতে হবে। ডেলফিতে আপনি এটি এইভাবে করতেন:

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

এটি জর্ডান রাসেল প্রস্তাব করেছিলেন, http://www.jrsoftware.org , (এও) ইনোসেটআপ এর লেখক, ("ইনো সেটআপ উইন্ডোজ প্রোগ্রামগুলির জন্য একটি ফ্রি ইনস্টলার। বৈশিষ্ট্য সেট এবং স্থিতিশীলতায় বাণিজ্যিক ইনস্টলারগুলি ") (আমি কেবলমাত্র আরও বেশি লোককে ইনোসেটআপ ব্যবহার করতে চাই)

আছে HTH


আপনাকে রেজিস্ট্রিটি সংশোধন করতে হবে। এছাড়াও, পূর্ণসংখ্যার কাস্টটি দুর্বল। Bit৪ বিটের সামঞ্জস্যের পরিবর্তে 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_SZREG_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/

সমস্ত প্রয়োজনীয় উইন্ডোজ এপিআই কল অন্তর্ভুক্ত রয়েছে যা আপনার প্রয়োজনের জন্য পুনরায় সংশোধন করা যেতে পারে। সহজেই সিস্টেম প্যাথটি সহজেই পরিবর্তন করা এটি একটি অটোহটকি জিইউআই। প্রশাসক হিসাবে চালানো দরকার।


প্রশ্ন পড়া. আবার।
jiggunjer

দুর্দান্ত স্ক্রিপ্ট। আমি হটকি ব্যবহার করি তবে স্ক্রিপ্টটি যুক্ত করতে কীভাবে বা আমার কী করা দরকার তা আমি জানি না। আপনি কি সহায়তা দিতে পারেন, একটি লিঙ্ক অফার করতে পারেন, বা কী করা দরকার তা ব্যাখ্যা করতে পারেন?
jwzumwalt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.