batch file - إضافة الدليل الحالي إلى مسار Windows بشكل دائم




batch-file command-line (2)

حل بسيط:

يختلف بناء جملة setx قليلاً عن بناء الجملة.

مع set ، أود أن أفعل:

set PATH=%PATH%;%cd%

مع setx ، كنت بحاجة إلى القيام بما يلي:

setx PATH "%cd"

تحدد الوسيطة الأولى اسم متغير البيئة.

تحدد الوسيطة الثانية القيمة التي يجب إضافتها إلى هذا المتغير.

علامات الاقتباس المزدوجة مطلوبة عندما تحتوي الوسيطة الثانية على مسافات.

قد يكون هذا هو الحال مع set ، بالمناسبة.

أحاول إضافة الدليل الحالي (من سطر الأوامر) إلى مسار Windows بشكل دائم ، لكنني أواجه مشكلات خطيرة في تنفيذ ذلك.

محاولتي الأولية كانت:

set PATH=%PATH%;%cd%

ومع ذلك ، هذا يعمل فقط في الجلسة الحالية ؛ بمجرد إغلاق نافذة سطر الأوامر ، يحتفظ متغير بيئة PATH بقيمته السابقة.

بعد ذلك ، حاولت:

setx PATH=%PATH%;%cd%

قد يعمل هذا في نظامي التشغيل Windows 7 و 8 وفقًا لبعض الإجابات التي وجدتها هنا ، ولكن في نظام التشغيل Windows 10 ، setx الأمر 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).

هل يمكن لشخص ما أن يقترح كيف أكمل هدفي بأسهل طريقة؟

إذا كان هناك بناء جملة مختلف لكل إصدار Windows ، فسيسعدني الحصول على هذه المعلومات أيضًا.

شكرا جزيلا!!!


كما هو موضح بالتفصيل في الإجابة على لماذا يتم أيضًا إضافة مسارات المجلدات الأخرى إلى نظام PATH مع SetX وليس فقط مسار المجلد المحدد؟ ليس من الجيد تعديل نظام أو مستخدم 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 ، على المدى التالي للدفعة file C:\Temp\Other Folder و C:\Temp\One More Folder على التنفيذ الثالث للملف الدفعي.

الحل لتجنب ذلك هو تعريف لمتغير بيئة تطبيق معين يسمى في ملف الدُفعات التالي MyAppPath الذي يتم الكتابة عليه دائمًا عند تنفيذ ملف الدُفعات. إلى المستخدم ، تتم إضافة 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 /?

يجب قراءة ما يلي أيضًا:





environment-variables