दिलचस्प पोस्ट
अजाक्स XmlHttpRequest के साथ फ़ाइल अपलोड करें वीबीए में टेक्स्टबॉक्स में एमएम / डीडी / वाई वाई वाई वाई की प्रारूपण सी # में जेनेरिक क्या हैं? $ स्थान / html5 और हैशबैंग मोड / लिंक रीरलाईटिंग के बीच स्विचिंग xslt तत्वों पर समूह कैसे लागू करें स्प्रिंग एमवीसी: रिसेप्शनबॉडी में छवि कैसे लौटाएगी? मैं HH: MM: SS में प्रारूप में दो बार स्ट्रिंग कैसे तुलना कर सकता हूं? अधिसूचना न दिखाए जाने के पहले कैसे? वापसी मूल्य के साथ संग्रहीत कार्यप्रणाली को कॉल करना एंड्रॉइड देखें.ग्रेडिंग कैश शून्य, केवल अशक्त का रिटर्न देता है Java.util.Date को java.sql.Date में कनवर्ट करने के लिए कैसे? क्या मैं छद्म तत्वों के लिए सिंगल या डबल कॉलन अंकन का उपयोग करना चाहिए? संस्थाओं के लिए मास्टर-विस्तार पृष्ठों का निर्माण करना, उन्हें कैसे लिंक करना है और किस बीन क्षेत्र को चुनना है फायरबेज उपयोगकर्ता टेबल पर अतिरिक्त विवरण जोड़ें SQL सर्वर में छवियों को संग्रहीत करना?

क्या Windows में कमांड प्रॉम्प्ट से पर्यावरण चर को ताज़ा करने के लिए कोई आदेश है?

अगर मैं एक परिवेश चर संशोधित या जोड़ता हूँ तो मुझे कमांड प्रॉम्प्ट को पुनरारंभ करना होगा क्या कोई कमांड मैं निष्पादित कर सकता हूं जो यह सीएमडी को पुनरारंभ किए बिना कर सकता है?

वेब के समाधान से एकत्रित समाधान "क्या Windows में कमांड प्रॉम्प्ट से पर्यावरण चर को ताज़ा करने के लिए कोई आदेश है?"

आप एक वीबीएस स्क्रिप्ट के साथ सिस्टम एंटरटेनमेंट वेरिएबल्स को कैप्चर कर सकते हैं, लेकिन मौजूदा वातावरण चर को बदलने के लिए आपको बल्ले की स्क्रिप्ट की आवश्यकता है, इसलिए यह एक संयुक्त समाधान है।

इस कोड वाले 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 

इस कोड वाले एक अन्य फ़ाइल नाम resetvars.bat बनाएँ, उसी स्थान:

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

जब आप पर्यावरण चर को ताज़ा करना चाहते हैं, तो बस resetvars.bat चलाएं


एपोलॉटेक्स :

मैं इस समाधान के साथ आने वाली दो मुख्य समस्याएं थीं

ए। मैं वीबीएस स्क्रिप्ट से पर्यावरण चर को निर्यात करने के लिए एक कमांड प्रॉम्प्ट पर वापस जाने का एक आसान तरीका नहीं मिल सका, और

ख। पथ पर्यावरण चर उपयोगकर्ता और सिस्टम PATH चर का एक संयोजन है

मुझे यकीन नहीं है कि सामान्य नियम उपयोगकर्ता और सिस्टम के बीच विरोधाभासी चर के लिए है, इसलिए मैंने उपयोगकर्ता ओवरराइड सिस्टम बनाने के लिए चुने, PATH चर के अलावा जो विशेष रूप से नियंत्रित किया जाता है

मैं वीबीएस से चर निर्यात करने की समस्या के आसपास काम करने के लिए अजीब वीबीएस + बैट + अस्थायी बैट तंत्र का उपयोग करता हूं।

नोट : यह स्क्रिप्ट चर को नष्ट नहीं करता है

यह शायद सुधार किया जा सकता है

जोड़ा

यदि आपको पर्यावरण को एक सीएमडी विंडो से दूसरे में निर्यात करना है, तो इस स्क्रिप्ट का उपयोग करें (चलो इसे 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 चलाएं exportvars.vbs आप निर्यात करना चाहते हैं, फिर उस विंडो में स्विच करें जिसे आप निर्यात करना चाहते हैं, और टाइप करें:

 "%TEMP%\resetvars.bat" 

चॉकलेटी का उपयोग किस प्रकार करता है

https://github.com/chocolatey/chocolatey/blob/master/src/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 . 

डिज़ाइन के अनुसार, किसी भी अन्य सीएमडी.एक्सए से या "मेरा कंप्यूटर -> गुण -> उन्नत सेटिंग्स – से एक पहले से चलने वाली सीएमडी.एक्सए में एक परिवेश चर जोड़ने / परिवर्तन / हटाए जाने के लिए विंडोज के लिए तंत्र में एक निर्मित नहीं है। पर्यावरण चर"।

यदि आप मौजूदा मौजूदा कमांड प्रॉम्प्ट के दायरे से बाहर एक नया परिवेश चर संशोधित या जोड़ते हैं, तो आपको कमांड प्रॉम्प्ट को पुनरारंभ करने की आवश्यकता होती है, या मौजूदा कमांड प्रॉम्प्ट में मैन्युअल रूप से SET का प्रयोग करना पड़ता है।

नवीनतम स्वीकार किए जाते हैं उत्तर एक स्क्रिप्ट में सभी पर्यावरण चर को मैन्युअल रूप से रीफ़्रेश करते हुए एक आंशिक कार्य-आसन दिखाता है। स्क्रिप्ट "मेरा कंप्यूटर … पर्यावरण चर" में वैश्विक रूप से बदलते परिवेश चर का उपयोग मामले को संभालता है, लेकिन अगर एक सीएमडी.एक्सए में एक पर्यावरण चर परिवर्तित हो जाता है तो स्क्रिप्ट इसे दूसरे चल रहे सीएमडी.एक्सए में प्रसारित नहीं करेगा।

यह विंडोज 7 पर काम करता है: SET PATH=%PATH%;C:\CmdShortcuts

टाइपिंग इको% PATH% द्वारा परीक्षण किया और यह काम किया, ठीक है। यह भी सेट करें कि यदि आप एक नया सीएमडी खोलते हैं, तो उन पेस्की रीबूट के लिए कोई ज़रूरत नहीं है 🙂

अंत में एक आसान समाधान खोजने से पहले मुझे इस उत्तर में आया था

बस कार्य प्रबंधक में explorer.exe को पुनरारंभ करें

मैंने परीक्षण नहीं किया, लेकिन आपको कमांड प्रॉम्प्ट को फिर से खोलना पड़ सकता है

टिमो हूविनिन को यहां क्रेडिट: सफलतापूर्वक स्थापित होने पर नोड को मान्यता नहीं मिली (यदि यह आपकी मदद करता है, तो कृपया इस व्यक्ति की टिप्पणी क्रेडिट दें)।

"Setx" का उपयोग करें और cmd prompt को पुनरारंभ करें

इस कार्य के लिए " setx " नामक एक कमांड लाइन टूल है यह env चर पढ़ने और लिखने के लिए है कमांड विंडो बंद होने के बाद चर मौजूद होते हैं।

यह "प्रोग्रामिंग या स्क्रिप्टिंग की आवश्यकता के बिना उपयोगकर्ता या सिस्टम परिवेश में पर्यावरण चर को बनाता है या संशोधित करता है। Setx कमांड भी रजिस्ट्री कुंजियों के मान को प्राप्त करती है और उन्हें पाठ फ़ाइलों में लिखती है।"

नोट: इस टूल द्वारा निर्मित या संशोधित चर भविष्य कमान विंडो में उपलब्ध होंगे, लेकिन वर्तमान सीएमडी.एक्सई कमांड विंडो में नहीं। तो, आपको पुनः आरंभ करना होगा

यदि setx गुम है:


या रजिस्ट्री को संशोधित करें

एमएसडीएन का कहना है:

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

यह ऐप्स को अनुमति देता है, जैसे शेल, आपके अपडेट को चुनने के लिए।

विंडोज 7/8/10 पर आप चॉकलेटी स्थापित कर सकते हैं जिसमें इस के अंदर लिखित एक स्क्रिप्ट है।

चॉकलेटी स्थापित करने के बाद, उद्धरण चिह्नों के बिना बस "रिफ्रेशनव" टाइप करें

इस फ़ंक्शन को कॉल करने के लिए मेरे लिए काम किया है:

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

मैं सबसे अच्छी पद्धति के साथ आया था एक रजिस्ट्री क्वेरी बस क्या करना था। यहाँ मेरा उदाहरण है

मेरे उदाहरण में मैंने एक बैच फ़ाइल का उपयोग करके स्थापित किया था जो कि नए पर्यावरण चर को जोड़ा था। जैसे ही स्थापना पूर्ण हो गई थी, मुझे इसके साथ कुछ करने की जरूरत थी, लेकिन उन नए चर के साथ एक नई प्रक्रिया को पैदा करने में असमर्थ था। मैं एक और एक्सप्लोरर खिड़की का इस्तेमाल किया और इसे वापस cmd.exe पर बुलाया और यह काम किया, लेकिन विस्टा और विंडोज 7 पर, एक्सप्लोरर केवल एक उदाहरण के रूप में चलाया जाता है और आम तौर पर उस व्यक्ति के रूप में लॉग इन होता है। यह स्वचालन के साथ असफल हो जायेगा क्योंकि मुझे अपने एडमिन क्रेडिट की ज़रूरत है स्थानीय सिस्टम से या बॉक्स के प्रशासक के रूप में चलने की परवाह किए बिना काम करते हैं। इसकी सीमा यह है कि यह पथ की तरह चीजों को संभाल नहीं करता है, यह केवल साधारण परिवेश चर पर काम करता है इससे मुझे एक बैच का उपयोग करने के लिए एक निर्देशिका (रिक्त स्थान के साथ) पर पहुंचने और फ़ाइलें चलाने में प्रतिलिपि बनाने की इजाजत दी थी .exes और आदि। यह आज के संसाधनों से stackoverflow.com पर लिखा गया था

नए बैच के लिए मूल बैच कॉल:

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 

इसके अलावा वहाँ एक और तरीका है कि मैं विभिन्न विभिन्न विचारों से आया था कृपया नीचे देखे। यह मूल रूप से रजिस्ट्री से नवीनतम पथ वैरिएबल मिलेगा, लेकिन कई मामलों में रजिस्ट्री क्वेरी से वैरिएबल देनी होगी, इसका मतलब है कि हर जगह एक चर यह काम नहीं करेगा, इसलिए इस समस्या से निपटने के लिए मूलतः मार्ग को दोहराएं दर्दनाक। अधिक प्रस्तुत विधि करना होगा: पथ =% पथ% सेट करें: सी: \ प्रोग्राम फ़ाइलें \ सॉफ्टवेयर …. \

भले ही यहां नई बैच फाइल है, कृपया सावधानी बरतें।

 @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 

यह एक विशिष्ट प्रक्रिया के भीतर ही पर्यावरण तालिका को अधिलेखित करके करना संभव है।

अवधारणा के प्रमाण के रूप में मैंने यह नमूना ऐप लिखा, जिसने सिर्फ एक सीएमडी.एक्सए प्रक्रिया में एक एकल (ज्ञात) पर्यावरण चर संपादित किया है:

 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 

टिप्पणियाँ

यह दृष्टिकोण सुरक्षा प्रतिबंधों तक भी सीमित होगा। यदि लक्ष्य उच्च ऊंचाई या उच्चतर खाता (जैसे कि सिस्टम) पर चलाया जाता है, तो हमें इसकी स्मृति को संपादित करने की अनुमति नहीं होगी

यदि आप ऐसा 32-बिट ऐप में करना चाहते हैं, तो हार्ड कोडित ऑफसेट ऊपर क्रमशः 0x10 और 0x48 में बदल जाएगा। इन ऑफसेट को डीबगर (उदाहरण के लिए WinDbg dt _PEB और dt _RTL_USER_PROCESS_PARAMETERS ) में डीपीआईबी और _आरटीएल_यूएसआरआईपीआरसीएएसएसआरएआरपीआरएस डंपिंग के द्वारा पाया जा सकता है

प्रॉप्यूस ऑफ अवधारणा को ओपी की जरूरतों में बदलने के लिए, यह वर्तमान सिस्टम और उपयोगकर्ता पर्यावरण चर (जैसे कि @ सदाक के उत्तर द्वारा प्रलेखित) की गणना करेगा और पूरे पर्यावरण तालिका को लक्ष्य प्रक्रिया मेमोरी में लिख देगा।

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

पर्यावरण चर HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet \ Control \ सत्र प्रबंधक \ पर्यावरण में रखा जाता है

कई उपयोगी एएन vars, जैसे पथ, को आरजीआईजीएस के रूप में संग्रहित किया जाता है। रजिस्ट्री सहित रजिस्ट्री तक पहुंचने के कई तरीके हैं:

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

उत्पादन मेज़िक नंबर से शुरू होता है तो इसे खोजने के आदेश के साथ खोजने के लिए इसे टाइप करने और रीडायरेक्ट करने की आवश्यकता है: type <filename> | findstr -c:\"Path\" type <filename> | findstr -c:\"Path\"

इसलिए, यदि आप अपने वर्तमान कमांड में पाथ वेरिएबल को सिस्टम गुणों के साथ ताज़ा करना चाहते हैं तो निम्नलिखित बैच स्क्रिप्ट ठीक काम करती है:

RefreshPath.cmd:


     @echo बंद

     REM इस समाधान रजिस्ट्री से पढ़ने के लिए उन्नयन अनुरोध करता है।

     यदि% temp% \ env.reg डेल% temp% \ env.reg / q / f मौजूद है

     Regedit / e% temp% \ env.reg "HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ नियंत्रण \ सत्र प्रबंधक \ पर्यावरण"

     यदि नहीं है तो% temp% \ env.reg (
        गूंज "अस्थायी स्थान पर रजिस्ट्री लिखने में असमर्थ"
        बाहर निकलें 1
        )

     SETLOCAL EnableDelayedExpansion

     के लिए / च "टोकन = 1,2 * delims ==" %% i में ('प्रकार% temp% \ env.reg ^ | findstr -c: \ "पथ \" =') के लिए (
        सेट अप = %% ~ ज
        गूंज! ऊपर: \\ = \!  >% अस्थायी% \ Newpath
        )

      ENDLOCAL

      / एफ "टोकन = *" %% i (% temp% \ newpath) के लिए पथ सेट करें = %% i 

एक व्यवस्थापक के रूप में एक नया कमांड प्रॉम्प्ट खोलने का प्रयास करें यह विंडोज 10 पर मेरे लिए काम करता है। (मुझे पता है यह एक पुराना उत्तर है, लेकिन मुझे इसे साझा करना पड़ा क्योंकि वीबीएस लिपि लिखना सिर्फ बेतुका है)।

मैं अपनी बैच स्क्रिप्ट में निम्नलिखित कोड का उपयोग करता हूं:

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

एसईटीएक्स के बाद एसईटी का इस्तेमाल करके यह "लोकल" वैरिएबल का उपयोग सीधे कमांड विंडो को पुनरारंभ किए बिना कर सकता है। और अगले रन पर, पर्यावरण चर का उपयोग किया जाएगा।

बस explorer.exe को पुनरारंभ करें >> जीत 8 एक्स 64 पर परीक्षण किया

वर्तमान सत्र के लिए रिबूट किए बिना पथ में एक चर जोड़ने का सबसे आसान तरीका कमांड प्रॉम्प्ट और प्रकार खोलना है:

 PATH=(VARIABLE);%path% 

और एन्टर दबाएं।

यह जांचने के लिए कि आपका चर लोड हो रहा है, प्रकार

 PATH 

और एन्टर दबाएं। हालांकि, जब तक आप रीबूट नहीं करते, वेरिएबल केवल पथ का एक हिस्सा होगा।

केव ने कहा, कोई सीधा रास्ता नहीं है। ज्यादातर मामलों में, अन्य सीएमडी बॉक्स को अंडे लगाने में आसान होता है। अधिक नाराज, चल रहे कार्यक्रमों में परिवर्तनों के बारे में पता नहीं है (यद्यपि IIRC इस तरह के परिवर्तन की सूचना देने के लिए एक प्रसारण संदेश हो सकता है)।

यह खराब हो गया है: विंडोज़ के पुराने संस्करणों में, आपको लॉग ऑफ करना पड़ा और फिर खाते में परिवर्तनों को लेने के लिए लॉग आउट करना पड़ा …

अनामिका के उत्तर में पोस्ट के रूप में मैं chocolatey द्वारा पीछा दृष्टिकोण पसंद आया, क्योंकि यह एक शुद्ध बैच दृष्टिकोण है। हालांकि, यह एक अस्थायी फ़ाइल छोड़ देता है और कुछ अस्थायी चर के आसपास झूठ बोल रही है। मैंने अपने लिए क्लीनर संस्करण बनाया है

एक फाइल refreshEnv.bat करें 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. 

मैं POWHHER चर को जोड़ने के लिए इस शक्तिशाली स्क्रिप्ट का उपयोग करता हूँ थोड़ा सा समायोजन के साथ यह आपके मामले में भी काम कर सकता है मुझे विश्वास है

 #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%" 

Restarting explorer did this for me, but only for new cmd terminals.

The terminal I set the path could see the new Path variable already (in Windows 7).

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

The confusing thing might be that there are a few places to start the cmd from. In my case I ran cmd from windows explorer and the environment variables did not change while when starting cmd from the "run" (windows key + r) the environment variables were changed .

In my case I just had to kill the windows explorer process from the task manager and then restart it again from the task manager .

Once I did this I had access to the new environment variable from a cmd that was spawned from windows explorer.

no, I don't think so… you can set them manually though. So you can put them in a batch file or something.

probably could make a utility/script (if someone hasn't already) that queries the registry and sets the current enviroment to be the same

Edit: this only works if the environment changes you're doing are as a result of running a batch file.

If a batch file begins with SETLOCAL then it will always unravel back to your original environment on exit even if you forget to call ENDLOCAL before the batch exits, or if it aborts unexpectedly.

Almost every batch file I write begins with SETLOCAL since in most cases I don't want the side-effects of environment changes to remain. In cases where I do want certain environment variable changes to propagate outside the batch file then my last ENDLOCAL looks like this:

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

If it concerns just one (or a few) specific vars you want to change, I think the easiest way is a workaround : just set in in your environment AND in your current console session

  • Set will put the var in your current session
  • SetX will put the var in the environment, but NOT in your current session

I have this simple batch script to change my Maven from Java7 to Java8 (which are both env. vars) The batch-folder is in my PATH var so I can always call ' j8 ' and within my console and in the environment my JAVA_HOME var gets changed:

j8.bat:

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

Till now I find this working best and easiest. You probably want this to be in one command, but it simply isn't there in Windows…

To solve this I have changed the environment variable using BOTH setx and set, and then restarted all instances of explorer.exe. This way any process subsequently started will have the new environment variable.

My batch script to do this:

 setx /M ENVVAR "NEWVALUE" set ENVVAR="NEWVALUE" taskkill /f /IM explorer.exe start explorer.exe >nul exit 

The problem with this approach is that all explorer windows that are currently opened will be closed, which is probably a bad idea – But see the post by Kev to learn why this is necessary

Or you can just do it manually via

To view or change environment variables: Right-click My Computer, and then click Properties. Click the Advanced tab. Click Environment variables. Click one the following options, for either a user or a system variable: Click New to add a new variable name and value. Click an existing variable, and then click Edit to change its name or value. Click an existing variable, and then click Delete to remove it. http://support.microsoft.com/kb/310519

Windows XP Environment variables

 %ALLUSERSPROFILE% (%PROGRAMDATA%) C:\Documents and Settings\All Users %APPDATA% C:\Documents and Settings\{username}\Application Data %COMPUTERNAME% {computername} %COMMONPROGRAMFILES% C:\Program Files\Common Files %COMMONPROGRAMFILES(x86)% C:\Program Files (x86)\Common Files %COMSPEC% C:\Windows\System32\cmd.exe %HOMEDRIVE% C: %HOMEPATH% \Documents and Settings\{username} %LOCALAPPDATA% Not available %LOGONSERVER% \\{domain_logon_server} %PATH% C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths} %PATHEXT% .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH %PROGRAMFILES% C:\Program Files %PROGRAMFILES(X86)% C:\Program Files (x86) (only in 64-bit version) %PROMPT% Code for current command prompt format. Code is usually $P$G %SystemDrive% C: %SystemRoot% The Windows directory, usually C:\Windows, formerly C:\WINNT %TEMP% and %TMP% C:\Documents and Settings\{username}\Local Settings\Temp %USERDOMAIN% {userdomain} %USERNAME% {username} %USERPROFILE% C:\Documents and Settings\{username} %WINDIR% C:\Windows %PUBLIC% %PROGRAMDATA% Only available in Windows Vista and newer versions %PSModulePath% 

Windows 7 Environment variables

 %ALLUSERSPROFILE% (%PROGRAMDATA%) C:\ProgramData %APPDATA% C:\Users\{username}\AppData\Roaming %COMPUTERNAME% {computername} %COMMONPROGRAMFILES% C:\Program Files\Common Files %COMMONPROGRAMFILES(x86)% C:\Program Files (x86)\Common Files %COMSPEC% C:\Windows\System32\cmd.exe %HOMEDRIVE% C: %HOMEPATH% \Users\{username} %LOCALAPPDATA% C:\Users\{username}\AppData\Local %LOGONSERVER% \\{domain_logon_server} %PATH% C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths} %PATHEXT% .com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh;.msc %PROGRAMFILES% C:\Program Files %PROGRAMFILES(X86)% C:\Program Files (x86) (only in 64-bit version) %PROMPT% Code for current command prompt format. Code is usually $P$G %SystemDrive% C: %SystemRoot% C:\Windows %TEMP% and %TMP% C:\Users\{username}\AppData\Local\Temp %USERDOMAIN% {userdomain} %USERNAME% {username} %USERPROFILE% C:\Users\{username} %WINDIR% C:\Windows %PUBLIC% C:\Users\Public %PROGRAMDATA% C:\ProgramData %PSModulePath% %SystemRoot%\system32\WindowsPowerShell\v1.0\Modules\ 

http://www.binbert.com/blog/2010/09/default-environment-variable-values-of-windows-7-xp/

उम्मीद है की यह मदद करेगा।

Just type "# -r" (without quotes # with -r option) in your terminal. And you're all set to default paths 🙂