batch file - স্থায়ীভাবে উইন্ডোজ পথে বর্তমান ডিরেক্টরি যুক্ত করা হচ্ছে




batch-file command-line (2)

উত্তর হিসাবে বিশদে বর্ণিত হিসাবে কেন অন্যান্য ফোল্ডার পাথগুলিও সেটএক্সের সাহায্যে সিস্টেম প্যাথ-এ যোগ করা হয় এবং কেবলমাত্র নির্দিষ্ট ফোল্ডার পাথই নয়? স্থানীয় PATH ব্যবহার করে রেজিস্ট্রিতে সঞ্চিত PATH কোনও ফোল্ডার পাথ ওভাররাইটিং বা সংযোজন করে ব্যাচ ফাইলের মধ্যে থেকে সিস্টেম বা ব্যবহারকারীর পাথ পরিবর্তন করা ভাল নয়।

ব্যবহারকারী PATH বর্তমান ডিরেক্টরি পাথ যুক্ত করার জন্য এই কাজের একটি সমাধান হ'ল এই কোডটি উইন্ডোজ ভিস্তার বা পরে প্রকাশিত উইন্ডোজের সংস্করণে ব্যবহার করা হচ্ছে:

@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 ব্যাচের ফাইলের তৃতীয় প্রয়োগের ক্ষেত্রে C:\Temp\One More Folder

এটি এড়ানোর সমাধানটি হ'ল একটি অ্যাপ্লিকেশন নির্দিষ্ট পরিবেশের পরিবর্তনশীল এর একটি সংজ্ঞা যা পরের ব্যাচ ফাইল MyAppPath ডাকা হয় যা সর্বদা ব্যাচ ফাইলের MyAppPath ক্ষেত্রে ওভাররাইট করা হয়। ব্যবহারকারী PATH এ ইতিমধ্যে বিদ্যমান পরিবেশের পরিবর্তনশীল MyAppPath

@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

%MyAppPath% রেজিস্ট্রিতে সংরক্ষিত হিসাবে ব্যবহারকারী %MyAppPath% মধ্যে সর্বদা মাত্র %MyAppPath% এবং রেজিস্ট্রি মানটি REG_EXPAND_SZ টাইপ হয় । এনভায়রনমেন্ট ভেরিয়েবল MyAppPath রেজিস্ট্রিতে সংরক্ষিত থাকে তবে এটি REG_SZ টাইপ type 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).

কেউ দয়া করে কীভাবে আমার লক্ষ্যটি সহজতম উপায়ে সম্পন্ন করবেন?

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

আপনাকে অনেক ধন্যবাদ!!!


সহজ সমাধান:

set সিনট্যাক্স set সিনট্যাক্সের চেয়ে কিছুটা আলাদা।

set , আমি করব:

set PATH=%PATH%;%cd%

setx , আমার এটি করা দরকার:

setx PATH "%cd"

প্রথম যুক্তি পরিবেশের পরিবর্তনশীলের নাম নির্দিষ্ট করে।

দ্বিতীয় যুক্তি এই পরিবর্তনশীলটিতে যুক্ত করার জন্য মানটি নির্দিষ্ট করে।

দ্বিতীয় যুক্তিতে শূন্যস্থান উপস্থিত থাকার জন্য ডাবল-কোট প্রয়োজন।

set দ্বারা ক্ষেত্রেও এটি হতে পারে।






environment-variables