উইন্ডোজ কমান্ড প্রম্পট থেকে পরিবেশ পরিবর্তনশীল রিফ্রেশ করার জন্য একটি আদেশ আছে?


479

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


38
আসলে, প্রতিটি প্রোগ্রাম যা তাদের দেখার দরকার তা আবার চালু করতে হবে। প্রারম্ভকালীন প্রক্রিয়াটির মেমোরিটিতে পরিবেশটি অনুলিপি করা হয় এবং সুতরাং সিস্টেম-সংজ্ঞায়িত এনভ্যাওয়ারদের সাথে আর কোনও সংযোগ নেই।
জোয়ি

15
এগুলি পড়ার পরে, আমি বুঝতে পারি যে বাস্তব জগতে কোনও চামচ নেই ;) আপনি কেবল সেন্টিমিডি পুনরায় চালু করবেন।
n611x007

কমান্ড নয়, পুরো উত্তর নয়, তবে উইন 32 এপিআই ব্যবহার করে এর জন্য সমর্থন রয়েছে যদি আমি নিম্নলিখিতটি সঠিকভাবে পড়ি: সমর্থন. microsoft.com/en-us/help/104011/… শউড সেই লাইনটি একটিতে সংকলন করতে সক্ষম হবে সাধারণ সি প্রোগ্রাম এবং পরিবেশের পরিবর্তনশীল আপডেটের পরে এটি চালান।
চার্লস গ্রানওয়াল্ড

ডব্লুএম_সেটটিংচেঞ্জে (@ চার্লস গ্রুনওয়াল্ড উল্লিখিত উইন 32 এপি) এই থ্রেড অনুসারে সেন্টিমিডি.এক্সি উইন্ডোগুলির জন্য কাজ করে না: github.com/chocolatey/choco/issues/1589 - এ কারণেই তারা রিফ্রেশেনভ কমান্ড লিখেছিলেন
ডেভর

উত্তর:


137

আপনি সিস্টেম এনভায়রনমেন্ট ভেরিয়েবলগুলি একটি ভিবিএস স্ক্রিপ্টের সাহায্যে ক্যাপচার করতে পারেন, তবে বর্তমান পরিবেশের পরিবর্তনশীলগুলি পরিবর্তনের জন্য আপনার একটি ব্যাট স্ক্রিপ্টের প্রয়োজন, সুতরাং এটি একটি সম্মিলিত সমাধান।

resetvars.vbsএই কোডটি সম্বলিত একটি ফাইল তৈরি করুন এবং এটি পথে সংরক্ষণ করুন:

Set oShell = WScript.CreateObject("WScript.Shell")
filename = oShell.ExpandEnvironmentStrings("%TEMP%\resetvars.bat")
Set objFileSystem = CreateObject("Scripting.fileSystemObject")
Set oFile = objFileSystem.CreateTextFile(filename, TRUE)

set oEnv=oShell.Environment("System")
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem)
next
path = oEnv("PATH")

set oEnv=oShell.Environment("User")
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem)
next

path = path & ";" & oEnv("PATH")
oFile.WriteLine("SET PATH=" & path)
oFile.Close

এই কোডটি সহ একই ফাইলের আরেকটি ফাইলের নাম রিসেটভার্স.বাট তৈরি করুন:

@echo off
%~dp0resetvars.vbs
call "%TEMP%\resetvars.bat"

আপনি যখন পরিবেশের ভেরিয়েবলগুলি রিফ্রেশ করতে চান, কেবল চালান resetvars.bat


অ্যাপোলোজেটিক্স :

এই সমাধানটি নিয়ে আমি যে দুটি প্রধান সমস্যার মুখোমুখি হয়েছিল তা হ'ল

ক। আমি কোনও ভিবিএস স্ক্রিপ্ট থেকে কমান্ড প্রম্পটে ফিরে এনভায়রনমেন্ট ভেরিয়েবলগুলি রফতান করার সোজা উপায় খুঁজে পাইনি and

খ। PATH এনভায়রনমেন্ট ভেরিয়েবল হ'ল ব্যবহারকারী এবং সিস্টেম PATH ভেরিয়েবলের সংমিশ্রণ।

আমি নিশ্চিত নই যে ব্যবহারকারী এবং সিস্টেমের মধ্যে বিরোধী ভেরিয়েবলগুলির জন্য সাধারণ নিয়মটি কী, তাই আমি PATH ভেরিয়েবলটি বাদ দিয়ে যা ব্যবহারকারীকে ওভাররাইড সিস্টেম তৈরি করতে নির্বাচিত করেছিলাম যা বিশেষভাবে পরিচালিত হয়।

আমি vBS থেকে পরিবর্তনশীল রফতানির সমস্যাটি ঘিরে কাজ করতে অদ্ভুত vbs + bat + অস্থায়ী ব্যাট প্রক্রিয়া ব্যবহার করি।

দ্রষ্টব্য : এই স্ক্রিপ্টটি ভেরিয়েবল মুছবে না।

এটি সম্ভবত উন্নত করা যেতে পারে।

যোগ করা হয়েছে

আপনার যদি এক সেমিডি উইন্ডো থেকে অন্য একটিতে পরিবেশ রফতানি করতে হয় তবে এই স্ক্রিপ্টটি ব্যবহার করুন (আসুন এটি কল করুন exportvars.vbs):

Set oShell = WScript.CreateObject("WScript.Shell")
filename = oShell.ExpandEnvironmentStrings("%TEMP%\resetvars.bat")
Set objFileSystem = CreateObject("Scripting.fileSystemObject")
Set oFile = objFileSystem.CreateTextFile(filename, TRUE)

set oEnv=oShell.Environment("Process")
for each sitem in oEnv 
    oFile.WriteLine("SET " & sitem)
next
oFile.Close

চালান exportvars.vbsউইন্ডোতে আপনি রপ্তানি করতে চান থেকে , তারপর জানালা আপনি রপ্তানি করতে চান স্যুইচ করার জন্য , এবং টাইপ:

"%TEMP%\resetvars.bat"

2
সম্ভবত আপনি ফর / এফ "টোকেন = 1 ব্যবহার করে অস্থায়ী ফাইল এড়াতে পারবেন" * %% সি ইন ('রিসেটভারস.ভিবিএস') ডিও কনস্ট্রাক্ট
tzot

2
যেমনটি আমি আমার উত্তরে বলেছি "বা, বিদ্যমান কমান্ড প্রম্পটে ম্যানুয়ালি SET ব্যবহার করে যুক্ত করুন।" যা কার্যকরভাবে এটি করছে। ভাল উত্তর যদিও।
কেভ

2
@itsadok - প্রদত্ত যে এটি এখন স্বীকৃত উত্তর, আপনার স্ক্রিপ্টটি প্রসঙ্গে রেখে প্রথমে একটি সংক্ষিপ্ত ব্যাখ্যা যুক্ত করা উচিত। অর্থাত্ উল্লেখ করুন যে উপরের মত ম্যানুয়ালি আপডেট না করে বা সেমিডি.এক্স.ই.কে পুনরায় চালু না করে কোনও খোলা সিএমডি.এক্স.এইভিতে পরিবর্তনের প্রচার সম্ভব নয়।
কেভ

স্ক্রিপ্টটি "মাই কম্পিউটার ... এনভায়রনমেন্ট ভেরিয়েবলস" এ বিশ্বব্যাপী পরিবেশের পরিবর্তনশীলগুলির ব্যবহারের ক্ষেত্রে পরিচালনা করে তবে যদি পরিবেশের পরিবর্তনশীলকে একটি সেমিডে হয় তবে এক্সপিতে স্ক্রিপ্টটি এটি অন্য চলমান সেমিডি.এক্সেতে প্রচার করবে না যা আমি মনে করি সম্ভবত একটি সাধারণ দৃশ্য।
কেভ

1
@ কিসলিংগার: এটি আসলে সম্ভব নয়। তৈরি হওয়া যে কোনও প্রোগ্রাম তার নিজস্ব পরিবেশ আপডেট করতে পারে, তবে এটি চলমান cmd.exe উদাহরণের মতো নয়। একটি ব্যাচ ফাইল CMd.exe পরিবেশ আপডেট করতে পারে, কারণ এটি cmd.exe এর একই উদাহরণের মধ্যে চলে।
বেন ভয়েগট

112

চকোলেটি যা ব্যবহার করে তা এখানে।

https://github.com/chocolatey/choco/blob/master/src/chocolatey.resources/redirects/RefreshEnv.cmd

@echo off
::
:: RefreshEnv.cmd
::
:: Batch file to read environment variables from registry and
:: set session variables to these values.
::
:: With this batch file, there should be no need to reload command
:: environment every time you want environment changes to propagate

echo | set /p dummy="Reading environment variables from registry. Please wait... "

goto main

:: Set one environment variable from registry key
:SetFromReg
    "%WinDir%\System32\Reg" QUERY "%~1" /v "%~2" > "%TEMP%\_envset.tmp" 2>NUL
    for /f "usebackq skip=2 tokens=2,*" %%A IN ("%TEMP%\_envset.tmp") do (
        echo/set %~3=%%B
    )
    goto :EOF

:: Get a list of environment variables from registry
:GetRegEnv
    "%WinDir%\System32\Reg" QUERY "%~1" > "%TEMP%\_envget.tmp"
    for /f "usebackq skip=2" %%A IN ("%TEMP%\_envget.tmp") do (
        if /I not "%%~A"=="Path" (
            call :SetFromReg "%~1" "%%~A" "%%~A"
        )
    )
    goto :EOF

:main
    echo/@echo off >"%TEMP%\_env.cmd"

    :: Slowly generating final file
    call :GetRegEnv "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" >> "%TEMP%\_env.cmd"
    call :GetRegEnv "HKCU\Environment">>"%TEMP%\_env.cmd" >> "%TEMP%\_env.cmd"

    :: Special handling for PATH - mix both User and System
    call :SetFromReg "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" Path Path_HKLM >> "%TEMP%\_env.cmd"
    call :SetFromReg "HKCU\Environment" Path Path_HKCU >> "%TEMP%\_env.cmd"

    :: Caution: do not insert space-chars before >> redirection sign
    echo/set Path=%%Path_HKLM%%;%%Path_HKCU%% >> "%TEMP%\_env.cmd"

    :: Cleanup
    del /f /q "%TEMP%\_envset.tmp" 2>nul
    del /f /q "%TEMP%\_envget.tmp" 2>nul

    :: Set these variables
    call "%TEMP%\_env.cmd"

    echo | set /p dummy="Done"
    echo .

65
+1 যদি আপনার চকোলেটি ইনস্টল থাকে তবে আপনি RefreshEnvআপনার বর্তমান সেশনে আপডেট পরিবেশের পরিবর্তনগুলি পেতে চালাতে পারেন ।
মার্টিন ভালগুর

2
এটি ইউটিলিটি সফ্টওয়্যারের একটি অবিশ্বাস্যভাবে দরকারী টুকরা, ভাগ করে নেওয়ার জন্য অনেক ধন্যবাদ।
সাবুনকু


1
এই কাজ কি Powershellখুব উচিত ? এটি কেবল cmd.exeআমার জন্যই কাজ করছে বলে মনে হচ্ছে ।
ক্র্যাক

1
এটি পাওয়ারশেল, ক্র্যাকে আমার জন্য কাজ করে। উইন্ডোজ 10 এক্স 64 চালানো হচ্ছে।
mazunki

100

উইন্ডোজ 7/8/10 এ, আপনি চকোলেটি ইনস্টল করতে পারেন, যা এই অন্তর্নির্মিতটির জন্য একটি স্ক্রিপ্ট রয়েছে।

চকোলেটি ইনস্টল করার পরে, কেবল টাইপ করুন refreshenv


এটি বৈধ উত্তর, যে
ছেলেটি

2
আমি কি ভুল করছি? $> রিফ্রেশেনভ 'রিফ্রেশেনভ' কোনও অভ্যন্তরীণ বা বাহ্যিক কমান্ড, অপারেবল প্রোগ্রাম বা ব্যাচ ফাইল হিসাবে স্বীকৃত নয়।
অ্যাক্লোকে

নিবন্ধন করুন আপনার সিস্টেম কনফিট সম্পর্কে ডিবাগ করতে আরও বিশদ সরবরাহ করুন। ইতিমধ্যে আপনি এখানে একটি অনুরূপ উন্মুক্ত সমস্যা উল্লেখ করতে পারেন। github.com/chocolatey/choco/issues/250
জলি

এটি আমার পক্ষেও কাজ করে না। আমি ডাব্লু 7 পেশাদার, সম্ভবত এটি শুধুমাত্র আরও সম্পূর্ণ সংস্করণে কাজ করে।
alseether

1
যদি রিফ্রেশেভ অকালব্যাপী আপনার স্ক্রিপ্টটি উপস্থিত থাকে (যেমন এটি আমার জন্য হয়েছিল), আপনি তার পরিবর্তে "কল করুন রিফ্রেশইএনভিসিএমডি" ব্যবহার করতে পারেন। ( github.com/chocolatey/choco/issues/1461 দেখুন )
সিফিস

59

নকশা দ্বারা একটি অন্তর্নির্মিত হয় না Windows এর জন্য প্রক্রিয়া হয় অন্য cmd.exe থেকে বা "থেকে আমার কম্পিউটার একটি পরিবেশ পরিবর্তনশীল অ্যাড / পরিবর্তন করুন / সরান একটি ইতিমধ্যেই চলছে cmd.exe সঞ্চারিত হতে, -> বৈশিষ্ট্যাবলী -> উন্নত সেটিংস -> পরিবেশ পরিবর্তনশীল "।

আপনি যদি কোনও বিদ্যমান ওপেন কমান্ড প্রম্পটের সুযোগের বাইরে কোনও নতুন পরিবেশের পরিবর্তনশীল যুক্ত করেন তবে আপনাকে কমান্ড প্রম্পটটি পুনরায় চালু করতে হবে, অথবা বিদ্যমান কমান্ড প্রম্পটে SET ব্যবহার করে ম্যানুয়ালি যুক্ত করতে হবে।

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


কারও কাছে যদি এই সমস্যার কার্যকর সমাধান থাকে তবে আমি পর্যায়ক্রমে চেকইন করব এবং গ্রহণযোগ্য উত্তরটি পরিবর্তন করতে পারি।
এরিক শুনোভার

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয় কারণ এটি জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না। এটি না পাওয়া পর্যন্ত এই প্রশ্নটি কোনও গ্রহণযোগ্য উত্তর ছাড়াই থাকা উচিত।
shoosh

4
এবং বিরক্তিকরভাবে, cmd.exe এর অতিরিক্ত উদাহরণ গণনা করা হয় না। পরিবর্তনটি যে কোনও নতুন cmd.exe এর প্রতিফলিত হওয়ার আগে তাদের সকলকে হত্যা করতে হবে।

6
এই উত্তরের নেতিবাচক মন্তব্যগুলি এবং ডাউন চিহ্নিতকরণটি দেখায় যে সময়ে ভাঙা স্ট্যাক ওভারফ্লো কখনও কখনও হয়। কেভ সঠিক উত্তর দিয়েছেন। আপনার পছন্দ না হওয়ায় এটি চিহ্নিত করার কোনও কারণ নেই।
ডেভিড আরনো

কেভ অবশ্যই প্রশ্নের উত্তর দেয়। প্রশ্নটি কোনও বিল্ট-ইন সমাধান নেই।
এরিক শুনোভার

40

শেষ পর্যন্ত একটি সহজ সমাধান খুঁজে পাওয়ার আগে আমি এই উত্তরটি পেরিয়ে এসেছি।

কেবলমাত্র explorer.exeটাস্ক ম্যানেজারে পুনঃসূচনা করুন।

আমি পরীক্ষা করিনি, তবে আপনাকে কমান্ড প্রম্পটও আবার খোলার দরকার হতে পারে।

টিমো হুভিনেনকে এখানে ক্রেডিট : নোড সফলভাবে ইনস্টল হওয়া সত্ত্বেও স্বীকৃত নয় (যদি এটি আপনাকে সহায়তা করে তবে দয়া করে এই ব্যক্তির মন্তব্যের ক্রেডিট দিন)।


আমি এখানে পৌঁছেছি কারণ আমি ভিজ্যুয়াল স্টুডিওতে একটি বাহ্যিক সরঞ্জাম যুক্ত করার চেষ্টা করছিলাম যাতে এই ব্লগে বর্ণিত হিসাবে আমি আমার সমাধানের মূলে একটি কমান্ড প্রম্পট খুলতে পারি: neverindoubtnet.blogspot.com/2012/10/… ... এবং আমারও একই রকম সমস্যা ছিল ... আমি আমার গতিপথটি ভেরিয়েবলে উপস্থিত হতে "গিট" পাওয়ার চেষ্টা করছিলাম। আমি পিএটিএইচএইচ ভেরিয়েবলের সাথে গিট ডিরেক্টরিগুলি যুক্ত করেছি তবে তারপরে তারা ভিজ্যুয়াল স্টুডিও থেকে খোলার কমান্ড প্রম্পটে উপস্থিত হবে না। এর সহজ সমাধানটি ছিল ভিজ্যুয়াল স্টুডিও পুনরায় চালু করা। তারপরে PATH ভেরিয়েবলের নতুন সংযোজনগুলি cmd এ দৃশ্যমান ছিল।
ডেভিড ব্যারো

4
এই সমাধানটি আমাকে উইন্ডোজ 10
ganchito55

7
প্রশ্নটি ছিল: "এমন কোনও আদেশ আছে যা আমি কার্যকর করতে পারি যে সিএমডি পুনরায় চালু না করেই এটি করতে পারে ?"
ফ্লোরিয়ান এফ

টাস্ক ম্যানেজারের কাছ থেকে ঠিক আছে আমি এক্সপ্লোরার। এক্স পুনরায় আরম্ভ করতে পারিনি, কেবল তাকে শেষ করুন। আমি এটি করেছি তবে আমার টাস্ক বারটি ভেঙে গেছে। এক্সপ্লোরার শুরু করতে; ই এক্স এটি সত্যিই সহজ simple আসুন "Ctrl + shift + فرار" -> ফাইল -> "নতুন কার্য সম্পাদন করুন" -> "এক্সপ্লোরার এক্সেক্স" আমার পক্ষে কাজ করেছে। এবং হ্যাঁ, সর্বোপরি নতুন সিএমডি উইন্ডোতে এনভির ভার ব্যবহার করা হয়েছে। সবার জন্য ধন্যবাদ
অস্কার

ভাল সমাধান, আপনাকে ধন্যবাদ! @ অস্কারের মন্তব্যকে প্রসারিত ও সম্বোধন করতে: cmdপ্রশাসক হিসাবে একটি উইন্ডো শুরু করুন । কমান্ডটি ব্যবহার করুন taskkill /f /im explorer.exe && explorer.exe। এটি এক্সপ্লোরার। এক্স প্রক্রিয়াটিকে মেরে ফেলবে এবং এটি পুনরায় আরম্ভ করবে।
S3DEV

32

এটি উইন্ডোজ 7 এ কাজ করে: SET PATH=%PATH%;C:\CmdShortcuts

প্রতিধ্বনি% PATH% টাইপ করে পরীক্ষা করা হয়েছে এবং এটি কার্যকর হয়েছে fine আপনি যদি একটি নতুন সেন্টিমিডি খোলেন তবে সেট করুন, thoseসব অস্থির মানুষগুলির আর কোনও পুনরায় বুট করার দরকার নেই :)


1
আমার জন্য "নতুন সিএমডি" এর জন্য কাজ করছেন না (উইন 7 এক্স 64)। স্ক্রিনভিডিও
আইগর

26
এটি জিজ্ঞাসা করা প্রশ্নটি সমাধান করে না, এটি করা উচিত নয়। মূল প্রশ্নটি হ'ল কীভাবে একটি পরিবেশের পরিবর্তনশীলকে এমন মানের সাথে রিফ্রেশ করা যায় যা সেই টার্মিনালের বাইরে চলে গেছে।
csauve

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

25

"সেটেক্স" ব্যবহার করুন এবং সিএমডি প্রম্পট পুনরায় চালু করুন

এই কাজের জন্য " সেটেক্স " নামে একটি কমান্ড লাইন সরঞ্জাম রয়েছে । এটি env ভেরিয়েবলগুলি পড়ার এবং লেখার জন্য । কমান্ড উইন্ডোটি বন্ধ হওয়ার পরে ভেরিয়েবলগুলি বজায় থাকে।

এটি হবে "তৈরি করে অথবা ব্যবহারকারীর বা সিস্টেম পরিবেশে মডিফাই এনভায়রনমেন্ট ভেরিয়েবল, প্রোগ্রামিং বা স্ক্রিপ্টিং প্রয়োজন ছাড়া। Setx কমান্ড এছাড়াও রেজিস্ট্রি কি মান আহরণ এবং তাদের পাঠ্য ফাইল লিখেছেন।"

দ্রষ্টব্য: এই সরঞ্জাম দ্বারা তৈরি বা সংশোধিত ভেরিয়েবলগুলি ভবিষ্যতের কমান্ড উইন্ডোগুলিতে পাওয়া যাবে তবে বর্তমান সিএমডি.এক্সি কমান্ড উইন্ডোতে নয়। সুতরাং, আপনাকে আবার চালু করতে হবে।

যদি setxঅনুপস্থিত থাকে:


অথবা রেজিস্ট্রি পরিবর্তন করুন

এমএসডিএন বলে:

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

এটি শেল এর মতো অ্যাপ্লিকেশনগুলিকে আপনার আপডেটগুলি তুলতে অনুমতি দেয়।


1
পরিবেশ পরিবর্তনশীল পড়তে কীভাবে আপনি সেটেক্স ব্যবহার করবেন সে সম্পর্কে আপনি প্রসারিত করতে পারেন? আমি বিভিন্ন ডকুমেন্টেশন শেষ করেছি এবং আমি এটি কেবল দেখছি না। : - /
মার্ক রিবাউ

2
setx VARIABLE -k "HKEY_LOCAL_MACHINE \ সফ্টওয়্যার \ মাইক্রোসফ্ট, উইন্ডোজএনটি \ কারেন্ট ভার্সন \ কারেন্ট ভার্সন" প্রতিধ্বনিত% ভেরিয়েবল%
জেনস এ। কোচ

3
বর্তমান সিস্টেমের পরিবেশ: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\VARIABLEবর্তমান ব্যবহারকারীর পরিবেশ: HKEY_CURRENT_USER\Environment\VARIABLE
রিবাউ

5
সেটেক্স /? একটি নোটে বলেছেন: "একটি স্থানীয় সিস্টেমে, এই সরঞ্জাম দ্বারা তৈরি বা সংশোধিত ভেরিয়েবলগুলি ভবিষ্যতের কমান্ড উইন্ডোতে পাওয়া যাবে তবে বর্তমান সিএমডি.এক্সএইসি কমান্ড উইন্ডোতে নয়" " ওপি বর্তমান সিএমডি আপডেট করতে চেয়েছিল।
সুপারল

4
ক্রেতা হুঁশিয়ার! আপনার যদি বিশেষত দীর্ঘ হয় %PATH%তবে setxএটি 1024 বাইটে কেটে যেতে পারে! এবং ঠিক তার মতোই, তার সন্ধ্যা
নিখোঁজ হয়েছিল

15

এই ফাংশনটি কল করা আমার পক্ষে কাজ করেছে:

VOID Win32ForceSettingsChange()
{
    DWORD dwReturnValue;
    ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "Environment", SMTO_ABORTIFHUNG, 5000, &dwReturnValue);
}

8
এবং সমস্ত প্রোগ্রাম এই বার্তাটি শোনেন না (বাস্তবে তাদের বেশিরভাগই সম্ভবত না)
রেহান খাজা

না, এটি নন-জিইউআই প্রোগ্রামগুলির জন্যও কাজ করে। প্রোগ্রাম শোনার জন্য ... সমস্যাটি যদি নিশ্চিত হয়ে থাকে যে পুনরায় চালু হওয়া প্রোগ্রামটি আপডেট হওয়া পরিবেশটি গ্রহণ করবে এবং এটি আপনাকে দেয়।
ব্যবহারকারী 2023370

11

আমি যে সর্বোত্তম পদ্ধতিটি নিয়ে এসেছি তা হ'ল কেবল একটি রেজিস্ট্রি কোয়েরি করা। এখানে আমার উদাহরণ।

আমার উদাহরণে আমি একটি ব্যাচ ফাইল ব্যবহার করে একটি ইনস্টল করেছি যা নতুন পরিবেশের ভেরিয়েবল যুক্ত করেছে। ইনস্টলটি সম্পূর্ণ হওয়ার সাথে সাথে আমার এগুলি করার দরকার ছিল, তবে সেই নতুন ভেরিয়েবলগুলির সাথে একটি নতুন প্রক্রিয়া তৈরি করতে অক্ষম। আমি অন্য এক্সপ্লোরার উইন্ডোটি তৈরি করে পরীক্ষা করেছি এবং সেমিডি.এক্স.কে আবার ফোন করেছি এবং এটি কাজ করেছে তবে ভিস্তা এবং উইন্ডোজ on-তে এক্সপ্লোরার কেবলমাত্র একটি একক হিসাবে চালিত হয় এবং ব্যক্তি লগইন হিসাবে সাধারণত চালিত হয় This স্থানীয় সিস্টেম থেকে চালানো বা বাক্সে প্রশাসক হিসাবে নির্বিশেষে জিনিসগুলি করুন। এর সীমাবদ্ধতা হ'ল এটি পথের মতো জিনিসগুলি পরিচালনা করে না, এটি কেবল সাধারণ পরিবেশগত ভেরিয়েবলগুলিতে কাজ করে। এটি আমাকে একটি ডিরেক্টরিতে (স্পেস সহ) ডাইরেক্টরিতে ওঠার জন্য ব্যাচ ব্যবহার করার অনুমতি দেয় এবং .exes ইত্যাদিতে চালিত ফাইলগুলিতে অনুলিপি করে যা আজ stackoverflow.com এর মেইস রিসোর্স থেকে লেখা হয়েছিল written

অরিজিনাল ব্যাচ নতুন ব্যাচে কল করেছে:

testenvget.cmd SDROOT (বা ভেরিয়েবল যাই হোক না কেন)

@ECHO OFF
setlocal ENABLEEXTENSIONS
set keyname=HKLM\System\CurrentControlSet\Control\Session Manager\Environment
set value=%1
SET ERRKEY=0

REG QUERY "%KEYNAME%" /v "%VALUE%" 2>NUL| FIND /I "%VALUE%"
IF %ERRORLEVEL% EQU 0 (
ECHO The Registry Key Exists 
) ELSE (
SET ERRKEY=1
Echo The Registry Key Does not Exist
)

Echo %ERRKEY%
IF %ERRKEY% EQU 1 GOTO :ERROR

FOR /F "tokens=1-7" %%A IN ('REG QUERY "%KEYNAME%" /v "%VALUE%" 2^>NUL^| FIND /I "%VALUE%"') DO (
ECHO %%A
ECHO %%B
ECHO %%C
ECHO %%D
ECHO %%E
ECHO %%F
ECHO %%G
SET ValueName=%%A
SET ValueType=%%B
SET C1=%%C
SET C2=%%D
SET C3=%%E
SET C4=%%F
SET C5=%%G
)

SET VALUE1=%C1% %C2% %C3% %C4% %C5%
echo The Value of %VALUE% is %C1% %C2% %C3% %C4% %C5%
cd /d "%VALUE1%"
pause
REM **RUN Extra Commands here**
GOTO :EOF

:ERROR
Echo The the Enviroment Variable does not exist.
pause
GOTO :EOF

এছাড়াও আরও একটি পদ্ধতি আছে যা আমি বিভিন্ন বিভিন্ন ধারণা নিয়ে এসেছি। দয়া করে নীচে দেখুন. এটি মূলত রেজিস্ট্রি থেকে নতুন পাথ ভেরিয়েবলটি পাবেন তবে এটি রেজিস্ট্রি ক্যোয়ারী নিজেই ভেরিয়েবল দিতে চলেছে এমন অনেক সমস্যার কারণ ঘটবে, এর অর্থ এই যে যেখানেই কোনও পরিবর্তনশীল রয়েছে এটি কাজ করবে না, তাই এই সমস্যাটির বিরুদ্ধে লড়াই করার জন্য I মূলত পথটি দ্বিগুণ করুন। খুব বাজে। আরও পার্থক্যযুক্ত পদ্ধতিটি হ'ল: পাথ সেট করুন =% পাথ%; সি: \ প্রোগ্রাম ফাইলগুলি \ সফ্টওয়্যার .... \

এখানে নতুন ব্যাচ ফাইলটি নির্বিশেষে সাবধানতা অবলম্বন করুন।

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
set org=%PATH%
for /f "tokens=2*" %%A in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path ^|FIND /I "Path"') DO (
SET path=%%B
)
SET PATH=%org%;%PATH%
set path

8

বর্তমান সেশনের জন্য রিবুট না করে পাথে ভেরিয়েবল যুক্ত করার সহজতম উপায় হ'ল কমান্ড প্রম্পটটি খুলুন এবং টাইপ করুন:

PATH=(VARIABLE);%path%

এবং টিপুন enter

আপনার ভেরিয়েবল লোড হয়েছে কিনা তা পরীক্ষা করতে টাইপ করুন

PATH

এবং টিপুন enter। তবে আপনি পুনরায় বুট না করা পর্যন্ত চলকটি কেবলমাত্র পথের একটি অংশ হবে।


আমার পক্ষে কাজ করেনি, পথ
চলকটিতে

7

একটি নির্দিষ্ট প্রক্রিয়ার মধ্যেই এনভায়রনমেন্ট টেবিলটি ওভাররাইট করে এটি করা সম্ভব।

ধারণার প্রমাণ হিসাবে আমি এই নমুনা অ্যাপ্লিকেশনটি লিখেছিলাম, যা কেবলমাত্র একটি সিএমডি.এক্সই প্রক্রিয়াতে একটি একক (পরিচিত) পরিবেশ পরিবর্তনশীল সম্পাদনা করেছে:

typedef DWORD (__stdcall *NtQueryInformationProcessPtr)(HANDLE, DWORD, PVOID, ULONG, PULONG);

int __cdecl main(int argc, char* argv[])
{
    HMODULE hNtDll = GetModuleHandleA("ntdll.dll");
    NtQueryInformationProcessPtr NtQueryInformationProcess = (NtQueryInformationProcessPtr)GetProcAddress(hNtDll, "NtQueryInformationProcess");

    int processId = atoi(argv[1]);
    printf("Target PID: %u\n", processId);

    // open the process with read+write access
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, 0, processId);
    if(hProcess == NULL)
    {
        printf("Error opening process (%u)\n", GetLastError());
        return 0;
    }

    // find the location of the PEB
    PROCESS_BASIC_INFORMATION pbi = {0};
    NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), NULL);
    if(status != 0)
    {
        printf("Error ProcessBasicInformation (0x%8X)\n", status);
    }
    printf("PEB: %p\n", pbi.PebBaseAddress);

    // find the process parameters
    char *processParamsOffset = (char*)pbi.PebBaseAddress + 0x20; // hard coded offset for x64 apps
    char *processParameters = NULL;
    if(ReadProcessMemory(hProcess, processParamsOffset, &processParameters, sizeof(processParameters), NULL))
    {
        printf("UserProcessParameters: %p\n", processParameters);
    }
    else
    {
        printf("Error ReadProcessMemory (%u)\n", GetLastError());
    }

    // find the address to the environment table
    char *environmentOffset = processParameters + 0x80; // hard coded offset for x64 apps
    char *environment = NULL;
    ReadProcessMemory(hProcess, environmentOffset, &environment, sizeof(environment), NULL);
    printf("environment: %p\n", environment);

    // copy the environment table into our own memory for scanning
    wchar_t *localEnvBlock = new wchar_t[64*1024];
    ReadProcessMemory(hProcess, environment, localEnvBlock, sizeof(wchar_t)*64*1024, NULL);

    // find the variable to edit
    wchar_t *found = NULL;
    wchar_t *varOffset = localEnvBlock;
    while(varOffset < localEnvBlock + 64*1024)
    {
        if(varOffset[0] == '\0')
        {
            // we reached the end
            break;
        }
        if(wcsncmp(varOffset, L"ENVTEST=", 8) == 0)
        {
            found = varOffset;
            break;
        }
        varOffset += wcslen(varOffset)+1;
    }

    // check to see if we found one
    if(found)
    {
        size_t offset = (found - localEnvBlock) * sizeof(wchar_t);
        printf("Offset: %Iu\n", offset);

        // write a new version (if the size of the value changes then we have to rewrite the entire block)
        if(!WriteProcessMemory(hProcess, environment + offset, L"ENVTEST=def", 12*sizeof(wchar_t), NULL))
        {
            printf("Error WriteProcessMemory (%u)\n", GetLastError());
        }
    }

    // cleanup
    delete[] localEnvBlock;
    CloseHandle(hProcess);

    return 0;
}

নমুনা আউটপুট:

>set ENVTEST=abc

>cppTest.exe 13796
Target PID: 13796
PEB: 000007FFFFFD3000
UserProcessParameters: 00000000004B2F30
environment: 000000000052E700
Offset: 1528

>set ENVTEST
ENVTEST=def

মন্তব্য

এই পদ্ধতির সুরক্ষা সীমাবদ্ধতার মধ্যেও সীমাবদ্ধ থাকবে। যদি লক্ষ্যটি উচ্চতর উন্নতি বা উচ্চতর অ্যাকাউন্টে চালিত হয় (যেমন SYSTEM) তবে আমাদের এটির মেমরি সম্পাদনা করার অনুমতি নেই।

আপনি যদি 32-বিট অ্যাপ্লিকেশনটিতে এটি করতে চান তবে উপরের হার্ড কোডিং অফসেটগুলি যথাক্রমে 0x10 এবং 0x48 এ পরিবর্তিত হবে। এই অফসেটগুলি ডিবাগারে _PEB এবং _RTL_USER_PROCESS_PARAMETERS স্ট্রাক্টগুলি বের করে খুঁজে পাওয়া যায় (যেমন WinDbg dt _PEBএবং dt _RTL_USER_PROCESS_PARAMETERS)

ওপিকে যা দরকার তা প্রুফ-অফ-কনসেপ্টটি পরিবর্তনের জন্য, এটি কেবলমাত্র বর্তমান সিস্টেম এবং ব্যবহারকারীর পরিবেশের ভেরিয়েবলগুলি গণনা করবে (যেমন @ সাসডোকের উত্তর দ্বারা নথিভুক্ত) এবং লক্ষ্য প্রক্রিয়াটির স্মৃতিতে পুরো পরিবেশ সারণীটি লিখবে।

সম্পাদনা করুন: পরিবেশগত ব্লকের আকারটি _RTL_USER_PROCESS_PARAMETERS স্ট্রাক্টেও সংরক্ষণ করা হয়, তবে মেমরিটি প্রক্রিয়াটির গাদাতে বরাদ্দ করা হয়। সুতরাং একটি বাহ্যিক প্রক্রিয়া থেকে আমাদের এটির আকার পরিবর্তন এবং এটি আরও বড় করে তোলার ক্ষমতা থাকবে না। আমি পরিবেশ সংরক্ষণের জন্য লক্ষ্য প্রক্রিয়ায় অতিরিক্ত মেমরির বরাদ্দ করার জন্য ভার্চুয়ালআলোকেক্স ব্যবহার করে ঘুরেছি, এবং সম্পূর্ণ নতুন টেবিল সেট এবং পড়তে সক্ষম হয়েছি। দুর্ভাগ্যক্রমে পরিবেশকে স্বাভাবিক উপায়ে পরিবর্তন করার যে কোনও প্রচেষ্টা ক্র্যাশ হয়ে জ্বলে উঠবে কারণ ঠিকানাটি আর .িপিটির দিকে নির্দেশ করে না (এটি RtlSizeHeap এ ক্র্যাশ হবে)।


6

পরিবেশের ভেরিয়েবলগুলি HKEY_LOCAL_MACHINE Y SYSTEM \ ControlSet \ নিয়ন্ত্রণ \ সেশন ম্যানেজার \ পরিবেশে রাখা হয়।

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

REGEDIT /E &lt;filename&gt; "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment"

আউটপুট ম্যাজিক সংখ্যা দিয়ে শুরু হয়। সুতরাং এটি অনুসন্ধান আদেশের সাথে অনুসন্ধান করতে এটি টাইপ করে পুনঃনির্দেশিত করা প্রয়োজন:type <filename> | findstr -c:\"Path\"

সুতরাং, যদি আপনি কেবলমাত্র সিস্টেম বৈশিষ্ট্যগুলির সাথে আপনার বর্তমান কমান্ড সেশনে পাথ ভেরিয়েবলটি রিফ্রেশ করতে চান তবে নিম্নলিখিত ব্যাচের স্ক্রিপ্টটি ঠিক কাজ করে:

RefreshPath.cmd:

    @ কেচো অফ

    আরইএম এই সমাধানটি রেজিস্ট্রি থেকে পড়ার জন্য উচ্চতার অনুরোধ করে।

    যদি%%%% \ env.reg ডেল% টেম্পে% \ env.reg / q / f উপস্থিত থাকে

    "HKEY_LOCAL_MACHINE Y SYSTEM \ ControlSet001 \ নিয়ন্ত্রণ \ সেশন ম্যানেজার" পরিবেশ "

    % অস্থায়ী%% env.reg উপস্থিত না থাকলে (
       প্রতিধ্বনি "অস্থায়ী জায়গায় রেজিস্ট্রি লিখতে অক্ষম"
       প্রস্থান 1
       )

    SETLOCAL সক্ষম ডিলেডএক্স্পেনশন

    / f "টোকেনস = 1,2 * ডিলিমস ==" %% আই ইন ('টাইপ% টেম্প% \ env.reg ^ | সন্ধানের-সি: \ "পথ \" =') করুন (
       উপস্থাপন = %% ~ j
       প্রতিধ্বনি! উপরে: \\ = \! >% টেম্প% \ newpath
       )

     ENDLOCAL

     / f "টোকেনগুলি = *" %% i-তে (% টেম্পর% \ নিউপথ) পথ নির্ধারণ করে =%% i

5
পরিবেশের ভেরিয়েবলগুলি রেজিস্ট্রিতে রাখা হয় না । রেজিস্ট্রিতে যা রাখা হয় তা হ'ল একটি টেমপ্লেট , যা থেকে উইন্ডোজ এক্সপ্লোরার (পুনরায়) এর মতো প্রোগ্রামগুলি যখন তাদের বিজ্ঞপ্তি প্রকাশিত হয় তখন তাদের পরিবেশের ভেরিয়েবলগুলি তৈরি করে । প্রকৃত পরিবেশের পরিবর্তনশীলগুলি প্রতি প্রক্রিয়া অনুসারে প্রতিটি প্রসেসের নিজস্ব ঠিকানার জায়গায় সংরক্ষণ করা হয়, প্রাথমিকভাবে তার পিতামহীন প্রক্রিয়া থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং তারপরে প্রক্রিয়াটি অনুসারে পরিবর্তনযোগ্য।
জেডিবিপি

5

প্রশাসক হিসাবে নতুন কমান্ড প্রম্পট খোলার চেষ্টা করুন। এটি আমার জন্য উইন্ডোজ 10 এ কাজ করেছে (আমি জানি এটি একটি পুরানো উত্তর, তবে আমার এটি ভাগ করে নিতে হয়েছিল কারণ এর জন্য কোনও ভিবিএস স্ক্রিপ্ট লিখতে হবে তা অযৌক্তিক)।


5

পুনঃসূচনা এক্সপ্লোরারটি আমার জন্য এটি করেছিল, তবে কেবলমাত্র নতুন সেন্টিমিডি টার্মিনালের জন্য।

আমি যে টার্মিনালটির জন্য পথটি নির্ধারণ করেছি তা ইতিমধ্যে নতুন পাথ ভেরিয়েবলটি দেখতে পেল (উইন্ডোজ in এ)।

taskkill /f /im explorer.exe && explorer.exe

5

বিভ্রান্তকর বিষয়টি হ'ল এটি হতে পারে যে সেমিটি থেকে শুরু করার জন্য কয়েকটি জায়গা রয়েছে। আমার ক্ষেত্রে আমি দৌড়ে এক্সপ্লোরার জানালা থেকে cmd এবং পরিবেশ ভেরিয়েবল পরিবর্তন না করে যখন যখন শুরু "রান" থেকে cmd কমান্ড (Windows কী + R) পরিবেশ ভেরিয়েবল পরিবর্তন করা হয়েছে

আমার ক্ষেত্রে আমাকে কেবলমাত্র টাস্ক ম্যানেজারের উইন্ডোজ এক্সপ্লোরার প্রক্রিয়াটি শেষ করে ফেলতে হয়েছিল এবং তারপরে এটিকে আবার টাস্ক ম্যানেজার থেকে পুনরায় চালু করতে হবে

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


3

আমি আমার ব্যাচের স্ক্রিপ্টগুলিতে নিম্নলিখিত কোডটি ব্যবহার করি:

if not defined MY_ENV_VAR (
    setx MY_ENV_VAR "VALUE" > nul
    set MY_ENV_VAR=VALUE
)
echo %MY_ENV_VAR%

ব্যবহারের সেট পর SETX এটা কমান্ড উইন্ডো পুনরায় চালু ছাড়া সরাসরি "স্থানীয়" ভেরিয়েবল ব্যবহার করা সম্ভব। এবং পরবর্তী রানে, পরিবেশগত ভেরিয়েবল ব্যবহার করা হবে।


আপনি যা করেছেন তা আমি পেয়েছি, সম্ভবত সমান্তরাল স্ক্রিপ্টগুলির জন্য তিনি কিছু চান, একটি স্ক্রিপ্ট গ্লোবাল সেট করে যখন অন্য সেগুলি পড়ে। অন্যথায়, সেটেক্স জড়িত করার কোনও মানে নেই, সেট যথেষ্ট হবে।
জেসনএক্সএ

3

বেনাম কাপুরুষের উত্তরে পোস্ট হিসাবে চকোলেটি অনুসরণ করার পদ্ধতিটি আমি পছন্দ করেছি, কারণ এটি খাঁটি ব্যাচের পদ্ধতির। যাইহোক, এটি একটি অস্থায়ী ফাইল এবং কিছু অস্থায়ী ভেরিয়েবলগুলি পড়ে রয়েছে। আমি নিজের জন্য একটি ক্লিনার সংস্করণ তৈরি করেছি।

refreshEnv.batআপনার কোথাও একটি ফাইল তৈরি করুন PATH। সম্পাদন করে আপনার কনসোল পরিবেশকে রিফ্রেশ করুন refreshEnv

@ECHO OFF
REM Source found on https://github.com/DieterDePaepe/windows-scripts
REM Please share any improvements made!

REM Code inspired by http://stackoverflow.com/questions/171588/is-there-a-command-to-refresh-environment-variables-from-the-command-prompt-in-w

IF [%1]==[/?] GOTO :help
IF [%1]==[/help] GOTO :help
IF [%1]==[--help] GOTO :help
IF [%1]==[] GOTO :main

ECHO Unknown command: %1
EXIT /b 1 

:help
ECHO Refresh the environment variables in the console.
ECHO.
ECHO   refreshEnv       Refresh all environment variables.
ECHO   refreshEnv /?        Display this help.
GOTO :EOF

:main
REM Because the environment variables may refer to other variables, we need a 2-step approach.
REM One option is to use delayed variable evaluation, but this forces use of SETLOCAL and
REM may pose problems for files with an '!' in the name.
REM The option used here is to create a temporary batch file that will define all the variables.

REM Check to make sure we don't overwrite an actual file.
IF EXIST %TEMP%\__refreshEnvironment.bat (
  ECHO Environment refresh failed!
  ECHO.
  ECHO This script uses a temporary file "%TEMP%\__refreshEnvironment.bat", which already exists. The script was aborted in order to prevent accidental data loss. Delete this file to enable this script.
  EXIT /b 1
)

REM Read the system environment variables from the registry.
FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"`) DO (
  REM /I -> ignore casing, since PATH may also be called Path
  IF /I NOT [%%I]==[PATH] (
    ECHO SET %%I=%%K>>%TEMP%\__refreshEnvironment.bat
  )
)

REM Read the user environment variables from the registry.
FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY HKCU\Environment`) DO (
  REM /I -> ignore casing, since PATH may also be called Path
  IF /I NOT [%%I]==[PATH] (
    ECHO SET %%I=%%K>>%TEMP%\__refreshEnvironment.bat
  )
)

REM PATH is a special variable: it is automatically merged based on the values in the
REM system and user variables.
REM Read the PATH variable from the system and user environment variables.
FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH`) DO (
  ECHO SET PATH=%%K>>%TEMP%\__refreshEnvironment.bat
)
FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY HKCU\Environment /v PATH`) DO (
  ECHO SET PATH=%%PATH%%;%%K>>%TEMP%\__refreshEnvironment.bat
)

REM Load the variable definitions from our temporary file.
CALL %TEMP%\__refreshEnvironment.bat

REM Clean up after ourselves.
DEL /Q %TEMP%\__refreshEnvironment.bat

ECHO Environment successfully refreshed.

এটি কি% ক্লায়েন্টাম% এর জন্য? - আমার জন্য কাজ করেনি - stackoverflow.com/questions/37550160/…
ইগোর এল।

% ক্লায়েন্টাম% আমার পরিবেশে উপলব্ধ নয় এবং আপনার প্রশ্নটি পড়ে, আমি ধরে নেব যে এটি কোনও বাহ্যিক প্রক্রিয়া দ্বারা সেট করা কিছু something (যখন কোনও প্রক্রিয়া একটি শিশু প্রসেস শুরু করে, এটি সেই শিশুটির জন্য পরিবেশকে সামঞ্জস্য করতে সক্ষম)
ডিটারডিডিপি

হাই @ ডিটারডিপি, আপনার সমাধান আমার পক্ষে কাজ করে! আমি একটি 64-বিট মেশিনে উইন্ডোজ 10 ব্যবহার করছি। আমি একটি ত্রুটি পেয়েছি: "ত্রুটি: সিস্টেমটি নির্দিষ্ট রেজিস্ট্রি কী বা মান খুঁজে পেতে পারে না।" তবুও, পরিবেশের পরিবর্তনশীলগুলির আপডেট সফল is ত্রুটি কোথা থেকে আসে?
মুলিয়ার

আসলে এটি নিজেই পরীক্ষা না করে বলা শক্ত, তবে আমি অনুমান করছি যে ডাব্লু 10 এ রেজিস্ট্রি কাঠামোটি কিছুটা আলাদা হতে পারে। যদি আপনার এটির মতো মনে হয় তবে কমান্ড লাইনে কমান্ডগুলি প্রয়োগ করে ত্রুটিটি শিকার করার চেষ্টা করুন।
ডিটারডিডিপি

2

যদি মাত্র এক উদ্বেগ (অথবা কয়েক) নির্দিষ্ট পরিবর্তন করতে চান Vars, আমি মনে করি সবচেয়ে সহজ উপায় একটি হল কার্যসংক্রান্ত : শুধু আপনার পরিবেশে এবং আপনার বর্তমান কনসোল সেশন সেট

  • সেটটি আপনার বর্তমান অধিবেশনটিতে বৈকল্পিক রাখবে
  • সেটএক্স পরিবেশে বৈকল্পিক রাখবে, তবে আপনার বর্তমান অধিবেশনটিতে নয়

আমার মাভেনটিকে জাভা 7 থেকে জাভা 8-তে পরিবর্তন করার জন্য আমার কাছে এই সাধারণ ব্যাচের স্ক্রিপ্ট রয়েছে (যা উভয়ই এনভায়ু ভার্সন) ব্যাচ-ফোল্ডারটি আমার প্যাথ ভারে রয়েছে তাই আমি সর্বদা ' জে 8 ' এবং আমার কনসোলের মধ্যে এবং পরিবেশে আমার জাভাআহোম ভারতে কল করতে পারি পরিবর্তিত হয়:

j8.bat:

@echo off
set JAVA_HOME=%JAVA_HOME_8%
setx JAVA_HOME "%JAVA_HOME_8%"

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


2

সমাধানটি আমি কয়েক বছর ধরে ব্যবহার করছি:

@echo off
rem Refresh PATH from registry.
setlocal
set USR_PATH=
set SYS_PATH=
for /F "tokens=3* skip=2" %%P in ('%SystemRoot%\system32\reg.exe query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH') do @set "SYS_PATH=%%P %%Q"
for /F "tokens=3* skip=2" %%P in ('%SystemRoot%\system32\reg.exe query "HKCU\Environment" /v PATH') do @set "USR_PATH=%%P %%Q"
if "%SYS_PATH:~-1%"==" " set "SYS_PATH=%SYS_PATH:~0,-1%"
if "%USR_PATH:~-1%"==" " set "USR_PATH=%USR_PATH:~0,-1%"
endlocal & call set "PATH=%SYS_PATH%;%USR_PATH%"
goto :EOF

সম্পাদনা করুন: ওফস, এখানে আপডেট হওয়া সংস্করণ রয়েছে।


আমি আপনার উত্তর পছন্দ। এখানে আমার প্রশ্নের একই উত্তর পোস্ট stackoverflow.com/q/61473551/1082063 এবং আমি যেমন গ্রহণ করবে উত্তর। ধন্যবাদ।
ডেভিড আই ম্যাকিনটোস

1

কেভ যেমন বলেছিল তেমন কোনও সরল পথ নেই। বেশিরভাগ ক্ষেত্রে, অন্য একটি সিএমডি বাক্স স্প্যান করা সহজ। আরও বিরক্তিকরভাবে, চলমান প্রোগ্রামগুলি কোনও পরিবর্তন সম্পর্কে সচেতন নয় (যদিও আইআইআরসি এই জাতীয় পরিবর্তনের বিষয়ে অবহিত হওয়ার জন্য একটি সম্প্রচার বার্তা থাকতে পারে)।

এটি আরও খারাপ হয়েছে: উইন্ডোজের পুরানো সংস্করণগুলিতে, পরিবর্তনগুলি বিবেচনায় নিতে আপনাকে লগ ইন করতে হবে এবং আবার লগইন করতে হবে ...


1

আমি PATH ভেরিয়েবল যুক্ত করতে এই পাওয়ারশেল স্ক্রিপ্টটি ব্যবহার করি । কিছুটা সামঞ্জস্য করলে এটি আপনার ক্ষেত্রে কাজ করতে পারে আমিও বিশ্বাস করি।

#REQUIRES -Version 3.0

if (-not ("win32.nativemethods" -as [type])) {
    # import sendmessagetimeout from win32
    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

function global:ADD-PATH
{
    [Cmdletbinding()]
    param ( 
        [parameter(Mandatory=$True, ValueFromPipeline=$True, Position=0)] 
        [string] $Folder
    )

    # See if a folder variable has been supplied.
    if (!$Folder -or $Folder -eq "" -or $Folder -eq $null) { 
        throw 'No Folder Supplied. $ENV:PATH Unchanged'
    }

    # Get the current search path from the environment keys in the registry.
    $oldPath=$(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path

    # See if the new Folder is already in the path.
    if ($oldPath | Select-String -SimpleMatch $Folder){ 
        return 'Folder already within $ENV:PATH' 
    }

    # Set the New Path and add the ; in front
    $newPath=$oldPath+';'+$Folder
    Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath -ErrorAction Stop

    # Show our results back to the world
    return 'This is the new PATH content: '+$newPath

    # notify all windows of environment block change
    [win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [uintptr]::Zero, "Environment", 2, 5000, [ref]$result)
}

function global:REMOVE-PATH {
    [Cmdletbinding()]
    param ( 
        [parameter(Mandatory=$True, ValueFromPipeline=$True, Position=0)]
        [String] $Folder
    )

    # See if a folder variable has been supplied.
    if (!$Folder -or $Folder -eq "" -or $Folder -eq $NULL) { 
        throw 'No Folder Supplied. $ENV:PATH Unchanged'
    }

    # add a leading ";" if missing
    if ($Folder[0] -ne ";") {
        $Folder = ";" + $Folder;
    }

    # Get the Current Search Path from the environment keys in the registry
    $newPath=$(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path

    # Find the value to remove, replace it with $NULL. If it's not found, nothing will change and you get a message.
    if ($newPath -match [regex]::Escape($Folder)) { 
        $newPath=$newPath -replace [regex]::Escape($Folder),$NULL 
    } else { 
        return "The folder you mentioned does not exist in the PATH environment" 
    }

    # Update the Environment Path
    Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath -ErrorAction Stop

    # Show what we just did
    return 'This is the new PATH content: '+$newPath

    # notify all windows of environment block change
    [win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [uintptr]::Zero, "Environment", 2, 5000, [ref]$result)
}


# Use ADD-PATH or REMOVE-PATH accordingly.

#Anything to Add?

#Anything to Remove?

REMOVE-PATH "%_installpath_bin%"

1

এই প্রশ্নটি পোস্ট করার জন্য আপনাকে ধন্যবাদ যেটি বেশ আকর্ষণীয়, এমনকি 2019 সালেও (প্রকৃতপক্ষে, শেল সেন্টিমিডিটি নবায়ন করা সহজ নয় কারণ এটি উপরে বর্ণিত একটি একক উদাহরণ), কারণ উইন্ডোতে পরিবেশের ভেরিয়েবলগুলি পুনর্নবীকরণ অনেকগুলি অটোমেশন কাজ সম্পাদন করতে দেয় কমান্ড লাইনটি ম্যানুয়ালি পুনরায় চালু করতে হবে।

উদাহরণস্বরূপ, আমরা নিয়মিত পুনরায় ইনস্টল করা বিপুল সংখ্যক মেশিনে সফ্টওয়্যার স্থাপন ও কনফিগার করার অনুমতি দেওয়ার জন্য এটি ব্যবহার করি। এবং আমি স্বীকার করতেই পারি যে আমাদের সফ্টওয়্যার মোতায়েনের সময় কমান্ড লাইনটি পুনরায় চালু করা খুব অবৈজ্ঞানিক হবে এবং আমাদের প্রয়োজন এমন আনন্দদায়ক কাজগুলি খুঁজে বের করার প্রয়োজন হবে। আসুন আমাদের সমস্যার দিকে আসা যাক। আমরা নিম্নলিখিত হিসাবে এগিয়ে যান।

1 - আমাদের কাছে একটি ব্যাচের স্ক্রিপ্ট রয়েছে যা এর পরিবর্তে একটি পাওয়ারশেল স্ক্রিপ্টকে কল করে

[ফাইল: টাস্ক.এমডি]

cmd কমান্ড > powershell.exe -executionpolicy unrestricted -File C:\path_here\refresh.ps1

2 - এর পরে, রিফ্রেশ.এসপি 1 স্ক্রিপ্টটি রেজিস্ট্রি কী (গেটভ্যালিউনেমস) ইত্যাদি ব্যবহার করে পরিবেশের ভেরিয়েবলগুলি নবায়ন করে। তারপরে, একই পাওয়ারশেল স্ক্রিপ্টে, আমাদের কেবলমাত্র নতুন পরিবেশের ভেরিয়েবলগুলি কল করতে হবে। উদাহরণস্বরূপ, একটি সাধারণ ক্ষেত্রে, যদি আমরা সিমেন্ট কমান্ড ব্যবহার করে স্নিগ্ধ কমান্ডগুলি ব্যবহার করার আগে নোডজেএস আগে সন্নিবেশিত করেছি, ফাংশনটি আহ্বান করার পরে, আমরা সরাসরি একই সেশনে এনএমপি কল করতে পারি, নির্দিষ্ট প্যাকেজগুলি অনুসরণ করে।

[ফাইল: রিফ্রেশ.পিএস 1]

function Update-Environment {
    $locations = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session  Manager\Environment',
                 'HKCU:\Environment'
    $locations | ForEach-Object {
        $k = Get-Item $_
        $k.GetValueNames() | ForEach-Object {
            $name  = $_
            $value = $k.GetValue($_)

            if ($userLocation -and $name -ieq 'PATH') {
                $env:Path += ";$value"
            } else {

                Set-Item -Path Env:\$name -Value $value
            }
        }
        $userLocation = $true
    }
}
Update-Environment
#Here we can use newly added environment variables like for example npm install.. 
npm install -g create-react-app serve

পাওয়ারশেল স্ক্রিপ্টটি শেষ হয়ে গেলে, সিএমডি স্ক্রিপ্ট অন্যান্য কাজের সাথে চলে। এখন, একটি বিষয় মনে রাখবেন যে টাস্কটি শেষ হওয়ার পরে, পাওয়ারশেল স্ক্রিপ্টটি তার নিজস্ব অধিবেশনগুলিতে আপডেট করে থাকলেও, সিএমডি-তে এখনও নতুন পরিবেশের ভেরিয়েবলগুলির অ্যাক্সেস নেই। কেন আমরা পাওয়ারশেল স্ক্রিপ্টে প্রয়োজনীয় সমস্ত কাজগুলি করি যা সেগুলি অবশ্যই সেন্টিমিডির মতো একই কমান্ডগুলিতে কল করতে পারে।


0

সম্পাদনা: এটি কেবল তখনই কাজ করে যদি আপনি যে পরিবেশের পরিবর্তনগুলি ব্যাচ ফাইল চালানোর ফলে হয় as

যদি কোনও ব্যাচ ফাইলটি শুরু হয় SETLOCALতবে এটি কল করতে ভুলে গেলেও প্রস্থান করার সময় এটি সর্বদা আপনার আসল পরিবেশে ফিরে আসবেENDLOCAL ব্যাচটি প্রস্থান আগে গেলে বা এটি অপ্রত্যাশিতভাবে বাতিল হয়ে ।

আমার লেখা প্রায় প্রতিটি ব্যাচ ফাইলটি শুরু হয় SETLOCALযেহেতু বেশিরভাগ ক্ষেত্রেই আমি চাই না যে পরিবেশের পরিবর্তনের পার্শ্ব-প্রতিক্রিয়া থেকে যায়। আমি যখন ব্যাচ ফাইলের বাইরে প্রচারের জন্য কিছু পরিবেশের পরিবর্তনশীল পরিবর্তনগুলি ENDLOCALচাই তখন আমার শেষ দেখতে এটির মতো:

ENDLOCAL & (
  SET RESULT1=%RESULT1%
  SET RESULT2=%RESULT2%
)

-1

এটি সমাধান করার জন্য আমি দুটি সেটেক্স এবং সেট ব্যবহার করে পরিবেশের পরিবর্তনশীল পরিবর্তন করেছি এবং তারপরে এক্সপ্লোরার এক্সেক্সের সমস্ত দৃষ্টান্ত পুনরায় চালু করেছি। পরবর্তী সময়ে শুরু হওয়া যে কোনও প্রক্রিয়াতে নতুন পরিবেশের পরিবর্তনশীল থাকবে।

এটি করার জন্য আমার ব্যাচের স্ক্রিপ্ট:

setx /M ENVVAR "NEWVALUE"
set ENVVAR="NEWVALUE"

taskkill /f /IM explorer.exe
start explorer.exe >nul
exit

এই পদ্ধতির সাথে সমস্যাটি হ'ল বর্তমানে যে সমস্ত এক্সপ্লোরার উইন্ডো খোলা হয়েছে তা বন্ধ হয়ে যাবে, যা সম্ভবত একটি খারাপ ধারণা - তবে কেন প্রয়োজনীয় তা জানতে কেভের পোস্টটি দেখুন

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