batch file - मौजूदा निर्देशिका को विंडोज पथ पर स्थायी रूप से जोड़ना
batch-file command-line (2)
मैं वर्तमान निर्देशिका (कमांड-लाइन से) को विंडोज पथ पर स्थायी रूप से जोड़ने की कोशिश कर रहा हूं, लेकिन मुझे इसे लागू करने में गंभीर समस्याएं हो रही हैं।
मेरा प्रारंभिक प्रयास था:
set PATH=%PATH%;%cd%
हालाँकि, यह केवल वर्तमान सत्र में काम करता है;
जैसे ही मैं कमांड-लाइन विंडो बंद करता हूं,
PATH
पर्यावरण वैरिएबल अपने पिछले मान को बरकरार रखता है।
अगला, मैंने कोशिश की:
setx PATH=%PATH%;%cd%
यह विंडोज 7 और 8 में से कुछ के अनुसार काम कर सकता है, जो मुझे यहां मिले, लेकिन विंडोज 10 में,
setx
कमांड में काम करने के तीन तरीके हैं:
Syntax 1:
SETX [/S system [/U [domain\]user [/P [password]]]] var value [/M]
Syntax 2:
SETX [/S system [/U [domain\]user [/P [password]]]] var /K regpath [/M]
Syntax 3:
SETX [/S system [/U [domain\]user [/P [password]]]]
/F file {var {/A x,y | /R x,y string}[/M] | /X} [/D delimiters]
लंबी कहानी छोटी, मैं इसे काम करने में असमर्थ हूँ:
ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
क्या कोई व्यक्ति सुझाव दे सकता है कि अपने लक्ष्य को सबसे आसान तरीके से कैसे पूरा करें?
यदि प्रति विंडोज संस्करण में एक अलग वाक्यविन्यास है, तो मुझे यह जानकारी प्राप्त करने में खुशी होगी।
आपका बहुत बहुत धन्यवाद!!!
जैसा कि विस्तार में वर्णित है कि
अन्य फ़ोल्डर पथ को सेटएक्स के साथ सिस्टम पथ में क्यों जोड़ा गया है और न केवल निर्दिष्ट फ़ोल्डर पथ?
सिस्टम
या
यूजर के
PATH
को बैच फाइल में से केवल एक फाइल में ओवरराइट करके या किसी पथ पथ को
स्थानीय
PATH
का उपयोग करके रजिस्ट्री में संग्रहीत करके
PATH
को संशोधित करना अच्छा नहीं है।
उपयोगकर्ता
PATH
लिए वर्तमान निर्देशिका पथ को जोड़ने के लिए इस कार्य के लिए एक समाधान Windows Vista पर इस कोड का उपयोग कर रहा है या बाद में Windows के संस्करण जारी किए गए हैं:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKEY_CURRENT_USER\Environment" /v "Path" 2^>nul') do (
if /I "%%N" == "Path" (
set "UserPath=%%P"
if defined UserPath goto CheckPath
)
)
set "UseSetx=1"
if not "%CD:~1024,1%" == "" set "UseSetx="
if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%\System32\setx.exe Path "%CD%" >nul
) else (
%SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t REG_SZ /d "%CD%" >nul
)
endlocal
goto :EOF
:CheckPath
setlocal EnableDelayedExpansion
set "Separator="
if not "!UserPath:~-1!" == ";" set "Separator=;"
set "PathCheck=!UserPath!%Separator%"
if "!PathCheck:%CD%;=!" == "!PathCheck!" (
set "PathToSet=!UserPath!%Separator%%CD%"
set "UseSetx=1"
if not "!PathToSet:~1024,1!" == "" set "UseSetx="
if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%\System32\setx.exe Path "!PathToSet!" >nul
) else (
set "ValueType=REG_EXPAND_SZ"
if "!PathToSet:%%=!" == "!PathToSet!" set "ValueType=REG_SZ"
%SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t !ValueType! /d "!PathToSet!" >nul
)
)
endlocal
endlocal
इस समाधान का नुकसान एक
उपयोगकर्ता
PATH
, उदाहरण के लिए
C:\Temp;C:\Temp\Other Folder;C:\Temp\One More Folder
जब वर्तमान निर्देशिका पहली
C:\Temp
, तो बैच के अगले भाग पर; फ़ाइल
C:\Temp\Other Folder
और
C:\Temp\One More Folder
बैच फ़ाइल के तीसरे निष्पादन पर।
इससे बचने का उपाय अगले बैच फ़ाइल
MyAppPath
में एक एप्लिकेशन विशिष्ट पर्यावरण चर की परिभाषा है जिसे बैच फ़ाइल के निष्पादन पर हमेशा ओवरराइट किया जाता है।
उपयोगकर्ता के लिए
PATH
को केवल पर्यावरण
PATH
MyAppPath
के संदर्भ में जोड़ा जाता है यदि
उपयोगकर्ता
PATH
में पहले से मौजूद नहीं है।
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "UseSetx=1"
if not "%CD:~1024,1%" == "" set "UseSetx="
if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%\System32\setx.exe MyAppPath "%CD%" >nul
) else (
%SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v MyAppPath /t REG_SZ /d "%CD%" >nul
)
set "UserPath="
for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKEY_CURRENT_USER\Environment" /v "Path" 2^>nul') do (
if /I "%%N" == "Path" (
set "UserPath=%%P"
if defined UserPath goto CheckPath
)
)
if exist %SystemRoot%\System32\setx.exe (
%SystemRoot%\System32\setx.exe Path "%%MyAppPath%%" >nul
) else (
%SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t REG_EXPAND_SZ /d "%%MyAppPath%%" >nul
)
endlocal
goto :EOF
:CheckPath
setlocal EnableDelayedExpansion
set "Separator="
if not "!UserPath:~-1!" == ";" set "Separator=;"
if "!UserPath:%%MyAppPath%%=!" == "!UserPath!" (
set "PathToSet=!UserPath!%Separator%%%MyAppPath%%"
set "UseSetx=1"
if not "!PathToSet:~1024,1!" == "" set "UseSetx="
if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%\System32\setx.exe Path "!PathToSet!" >nul
) else (
%SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t REG_EXPAND_SZ /d "!PathToSet!" >nul
)
)
endlocal
endlocal
इस स्थिति में रजिस्ट्री में संग्रहित
उपयोगकर्ता
PATH
में हमेशा केवल
%MyAppPath%
और रजिस्ट्री मान
REG_EXPAND_SZ
प्रकार का होता है।
पर्यावरण चर
MyAppPath
का मान भी रजिस्ट्री में संग्रहीत है, लेकिन
REG_SZ
प्रकार का है।
MyAppPath
का मान बैच फ़ाइल के प्रत्येक निष्पादन पर वर्तमान निर्देशिका पथ में अद्यतन किया जाता है।
तो रजिस्ट्री में
उपयोगकर्ता
PATH
पहले की तुलना में एक अलग फ़ोल्डर से बैच फ़ाइल के प्रत्येक निष्पादन पर अधिक लंबा और लंबा नहीं मिलता है।
सामान्य तौर पर एक एप्लिकेशन या एप्लिकेशन सूट अच्छा कोडित नहीं होता है यदि उसका एप्लिकेशन फ़ोल्डर या उसका कोई सबफ़ोल्डर एप्लिकेशन के निष्पादन पर
स्थानीय
PATH
में होना चाहिए या सूट से किसी भी एप्लिकेशन को ठीक से काम करने के लिए।
एप्लिकेशन या एप्लिकेशन सूट अपने इंस्टॉलेशन पथ को रजिस्ट्री में किसी अन्य स्थान पर भी रख सकता है जैसे
App Paths
या
%APPDATA%
(उपयोगकर्ता खाते से संबंधित मानक एप्लिकेशन डेटा पथ) के किसी सबफ़ोल्डर में एक फ़ाइल जिसमें वह अगले रन पर पढ़ा जा सकता है।
इंस्टॉलर पैकेज को
उपयोगकर्ता
या
सिस्टम
PATH
केवल तभी संशोधित करना चाहिए जब इस एप्लिकेशन को मुख्य रूप से उपयोगकर्ता द्वारा कमांड प्रॉम्प्ट विंडो के भीतर से निष्पादित किया जाए।
उपयोग किए गए आदेशों को समझने के लिए और वे कैसे काम करते हैं, कमांड प्रॉम्प्ट विंडो खोलें, वहां निम्नलिखित कमांड निष्पादित करें, और प्रत्येक कमांड के लिए पूरी तरह से प्रदर्शित सभी सहायता पृष्ठों को बहुत सावधानी से पढ़ें।
-
echo /?
-
endlocal /?
-
for /?
-
goto /?
-
if /?
-
reg /?
-
reg add /?
-
reg query /?
-
set /?
-
setlocal /?
-
setx /?
निम्नलिखित को भी पढ़ा जाना चाहिए:
- विंडोज पर्यावरण चर के बारे में विकिपीडिया लेख।
-
Microsoft आलेख
का उपयोग कर के
बारे में
कमांड पुनर्निर्देशन ऑपरेटरों
समझा
>nul
। -
"START" निष्पादनयोग्य के लिए खोज कहाँ
पर उत्तर
है?
App Paths
बारे में विवरण के साथ। -
उत्तर पर
"X को आंतरिक या बाहरी कमांड, ऑपरेशनल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता प्राप्त नहीं है" का कारण क्या है?
स्थानीय
,
प्रणाली
और
उपयोगकर्ता
PATH
बारे में विवरण के साथ। - Windows में केवल एक बार बैच फ़ाइल में PATH पर्यावरण चर कैसे सेट करें पर उत्तर दें ?
- PATH पर्यावरण चर से विशिष्ट टोकन को हटाने के लिए मैं एक .bat फ़ाइल का उपयोग कैसे कर सकता हूं?
सरल समाधान:
setx
का सिंटैक्स
set
के सिंटैक्स से थोड़ा अलग होता है।
set
साथ, मैं करूँगा:
set PATH=%PATH%;%cd%
setx
साथ, मुझे करने की ज़रूरत है:
setx PATH "%cd"
पहला तर्क पर्यावरण चर का नाम निर्दिष्ट करता है।
दूसरा तर्क इस चर में जोड़ने के लिए मूल्य निर्दिष्ट करता है।
दूसरे तर्क में रिक्त स्थान होने पर दोहरे उद्धरण चिह्नों की आवश्यकता होती है।
यह
set
साथ मामला भी हो सकता है।