batch file - मौजूदा निर्देशिका को विंडोज पथ पर स्थायी रूप से जोड़ना




batch-file command-line (2)

जैसा कि विस्तार में वर्णित है कि अन्य फ़ोल्डर पथ को सेटएक्स के साथ सिस्टम पथ में क्यों जोड़ा गया है और न केवल निर्दिष्ट फ़ोल्डर पथ? सिस्टम या यूजर के 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 /?

निम्नलिखित को भी पढ़ा जाना चाहिए:

मैं वर्तमान निर्देशिका (कमांड-लाइन से) को विंडोज पथ पर स्थायी रूप से जोड़ने की कोशिश कर रहा हूं, लेकिन मुझे इसे लागू करने में गंभीर समस्याएं हो रही हैं।

मेरा प्रारंभिक प्रयास था:

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).

क्या कोई व्यक्ति सुझाव दे सकता है कि अपने लक्ष्य को सबसे आसान तरीके से कैसे पूरा करें?

यदि प्रति विंडोज संस्करण में एक अलग वाक्यविन्यास है, तो मुझे यह जानकारी प्राप्त करने में खुशी होगी।

आपका बहुत बहुत धन्यवाद!!!


सरल समाधान:

setx का सिंटैक्स set के सिंटैक्स से थोड़ा अलग होता है।

set साथ, मैं करूँगा:

set PATH=%PATH%;%cd%

setx साथ, मुझे करने की ज़रूरत है:

setx PATH "%cd"

पहला तर्क पर्यावरण चर का नाम निर्दिष्ट करता है।

दूसरा तर्क इस चर में जोड़ने के लिए मूल्य निर्दिष्ट करता है।

दूसरे तर्क में रिक्त स्थान होने पर दोहरे उद्धरण चिह्नों की आवश्यकता होती है।

यह set साथ मामला भी हो सकता है।






environment-variables