لدي أنا وزميلي محطات عمل Dell متطابقة مع Windows XP الإصدار x64 Professional المثبت.
يبدأ متغير بيئة المسار الخاص بي بـ:
%Java_HOME%\bin;...
يشتمل متغير Path الخاص بزميلي على نفس الدليل المحدد باستخدام متغير البيئة نفسه ، ولكنه ليس العنصر الأول في المسار الخاص به.
إذا قمت بالوصول إلى خصائص النظام -> متغيرات البيئة وقمت بتغيير قيمة متغير Java_HOME ، فإن إصدار Java الموجود من سطر الأوامر يتغير كما أتوقع. هذا هو بدء نافذة وحدة تحكم العلامة التجارية الجديدة ، للتأكد من التقاط التغييرات.
ولكن على آلة زميلي ، لا. يستمر في العثور على نسخته السابقة من Java حتى يقوم بإحضار متغير المسار الخاص به وحفظه (حتى إذا لم يقم بأي تغييرات عليه). (مرة أخرى ، يكون هذا عند بدء تشغيل نافذة وحدة تحكم جديدة تمامًا.)
لقد كنت أراقب هذا التناقض على نظام Windows لمدة 6 أشهر تقريبًا ولدي فضول كبير بشأنه. لدينا الكثير من إصدارات Windows في مكتبنا ، ونادراً ما أتيحت لي فرصة لرؤية هذا يحدث على جهازين يشغلان نفس إصدار نظام التشغيل ، حتى الآن.
لماذا يحدث هذا؟ لماذا لا يقوم الجهاز الخاص به بإعادة تقييم Path ، باستخدام Java_HOME الجديد ، عندما يقوم لي؟
(هل لأنها ليست أول شيء في المسار؟ إذا كان الأمر كذلك ، كيف يمكن أن يكون ، ولماذا؟ سأقوم بإجراء المزيد من الاختبارات للتحقق ، لكنني أعتقد أنه قد سئمت من ذلك الآن وأرغب في العودة إلى العمل .)
المسار الخاص بك هو تسلسل مسار النظام متبوعًا بمسار المستخدم. بالإضافة إلى ذلك ، قد لا تحتوي متغيرات بيئة النظام على مراجع لمتغيرات بيئة المستخدم ، ولن يتم توسيع أي من هذه المراجع . للحصول على النتيجة المرجوة ، أدخل المرجع إلى٪ Java_HOME٪ في متغير البيئة للمستخدم PATH ، أو أنشئ مثل هذا المتغير إذا لم يكن موجودًا بالفعل .
ولعل مثال مبسط سيجعل هذا أكثر وضوحا. لنفترض أن بيئة النظام هي
ProgramFiles = C:\Program Files
SystemRoot = C:\WINDOWS
PATH = %SystemRoot%\SYSTEM32
وبيئة المستخدم JSmith هي
Java_HOME = %ProgramFiles%\Java\bin
USERPROFILE = C:\USERS\JSmith
PATH = %Java_HOME%\bin;%USERPROFILE%\bin
ثم المسار الناتج سيكون
C:\WINDOWS\SYSTEM32;C:\Program Files\Java\bin;C:\Users\JSmith\bin
حسب الرغبة.
تحقق في سجل ويندوز تحت هذا المفتاح:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment
إذا كان متغير البيئة يحتاج إلى توسيع (هنا:٪ Java_HOME٪)
ثم يجب تعيين المتغير كقيمة REG_EXPAND_SZ .
إذا كان استخدام reg.exe عبر سطر الأوامر لإضافة/تحرير قيم التسجيل ، فسيكون الأمر افتراضيًا لكتابة REG_SZ. حدد النوع REG_EXPAND_SZ باستخدام الخيار reg add /t REG_EXPAND_SZ
.
توجد مشكلة محددة في توسيع متغيرات البيئة داخل متغير PATH عندما يمتد المتغير إلى مسار يحتوي على مسافات.
لقد أنشأنا متغيرات مستوى النظام الخاصة بنا مثل "OUR_ROOT = c:\MyRoot" ثم استخدمناها في نظام PATH مثل "PATH =؛٪ OUR_ROOT٪\bin؛" وهذا يتم توسيعه بشكل صحيح إلى "PATH =؛ c:\MyRoot\bin؛". حتى الآن لا مشكلة.
ولكن ، في Windows 7 (32 بت) ، كان لدي منتج يقوم بتثبيت نفسه وإنشاء متغيرات بيئة النظام مثل هذا:
STUDIO_BIN=C:\program files\Company Name\Product Name 10.4\bin
وأضفته إلى متغير PATH للنظام:
PATH=<other path elements>;%STUDIO_BIN%;<more path elements>
لكن قيم PATH المعروضة في CMD تحتوي على "٪ STUDIO_BIN٪؛" وليس المسار الموسع. بقيت القيمة في My Computer> Properties> Advanced> Env.Vars غير موسعة أيضًا. هذا يعني أنني لا أستطيع تشغيل البرامج التي تتطلب DLL في هذا الدليل.
عن طريق تغيير STUDIO_BIN (عبر جهاز الكمبيوتر الخاص بي> خصائص> خيارات متقدمة ...> Env Vars) إلى اسم بدون مسافات مضمنة:
STUDIO_BIN=C:\ProductName\bin
ثم أعد تشغيل نافذة CMD ، أصبح PATH الآن:
PATH=<other path elements>;C:\ProductName\bin;<more path elements>
هناك حل آخر يتمثل في تحرير متغير النظام بشكل كافٍ في PATH باستخدام مربع الحوار My Computer> Properties> Advanced ...> Environment Variables. حاولت إضافة حرف وإزالته لإجراء "تغيير" ، ثم "موافق" ، بدأت CMD Prompt جديد ولم يتم توسيع PATH بشكل صحيح. ثم حاولت حذف جزء من المسار لذلك كان
STUDIO_BIN=C:\Program Files\Company Name
(حذف "اسم المنتج 10.4") و lo ، وها ، موجه CMD التالي أظهر PATH مع STUDIO_BIN تم توسيعه بشكل صحيح!
الغريب ، إذا عدت وأضفت "اسم المنتج 10.4" إلى STUDIO_BIN (بما في ذلك جميع المساحات التي كانت في الأصل هناك قبل أن أبدأ في تناولها) وتم توسيع PATH بشكل صحيح.
من الواضح أنه مع التغيير الكافي في محتوياته ، يخضع متغير PATH لبعض المعالجة الإضافية في مربع حوار متغيرات البيئة الذي يسمح له بالعمل. لا تتم المعالجة عند إضافة المتغير بواسطة مثبّت المنتج (والذي ربما يكون قد عدل مسار PATH في السجل مباشرةً).
أنا متأكد تقريبًا أن هذه مشكلة في XP أيضًا. لقد ظهر لي مرة أخرى في نظام التشغيل Windows 7 عندما كنت أجمع آلة تطوير جديدة. يبدو أنه لم يتم إصلاحه بواسطة Microsoft.
يبدو أن متغيرات MS المحددة مثل٪ ProgramFiles٪ لن تتوسع بشكل صحيح في PATH.
توفر هذه الصفحة إجابة ممكنة إذا كنت تقوم بتعيين PATH عبر سطر الأوامر أو الملف الدفعي. (ضع الأمر بالكامل بعد SET في علامات الاقتباس.) لا أعرف المثبت الذي استخدمه المنتج الذي قمت بتثبيته لتعيين متغيرات البيئة ، ولكن من الواضح أنه تخطى أي معالجة مطلوبة لتوسيع المسارات بمسافات بشكل صحيح.
لذلك - لتلخيص ، يمكنك إما:
تغيير المسارات (ونقل جميع الملفات المرتبطة) إلى مسارات دون مسافات ، أو
قم بتحرير المتغيرات التي فشلت في التوسع في مربع حوار متغيرات البيئة (تغييرها بما يكفي لجعلها تعمل بشكل صحيح - أنا لست إيجابًا بالقدر الكافي).
لقد طلبت ذلك في منتديات Microsoft في مارس 2009 ، ولم يتم حلها مطلقًا:
كيفية استخدام٪ ProgramFiles٪ في متغير بيئة المسار؟ :
أحاول إضافة مجلد إلى متغير بيئة مسار النظام.
أريد أن أضيف ٪ ProgramFiles٪\SysInternals
إلى متغير المسار الحالي:
C:\PROGRA ~ 1\\ Delphi5\مشاريع بورلاند\BPL؛ C:\PROGRA ~ 1\بورلاند\Delphi5\بن؛ ٪ SYSTEMROOT٪ \SYSTEM32؛ ٪ SystemRoot٪ ؛٪ SystemRoot ٪\System32\Wbem ؛ C:\ملفات البرنامج\خادم SQL Server\80\Tools\BINN ؛ C:\Program Files\Microsoft SQL Server\80\Tools\Binn \؛ C:\Program Files\Microsoft SQL Server\90\Tools\binn \؛ C:\Program Files\Microsoft SQL Server\90\DTS\Binn \؛ C :\ملفات البرنامج\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE \؛ C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies \؛٪ SYSTEMROOT٪\SYSTEM32\ويندوز باورشيل\V1.0 \
لذلك أذهب إلى المكان الذي قمت بتحريره:
وأضيف المتغير إلى المسار:
٪ PROGRAMFILES ٪\سسنترنلس؛ C:\PROGRA ~ 1\بورلاند\Delphi5\مشاريع\BPL. (قصاصة)
ثم فتح نافذة موجه الأوامر الجديدة ، لا يتم استبدال متغير البيئة بقيمته الفعلية:
مسار =٪ PROGRAMFILES ٪\سسنترنلس؛ C:\PROGRA ~ 1\بورلاند\Delphi5\مشاريع\BPL (قص)>
الذي يمكنك رؤيته في لقطة الشاشة التالية:
ولكن للإجابة على سؤالك: لا أعرف. يبدو أنه لا يمكن القيام به.
هناك مستويان من متغيرات البيئة ، العالمية والمستخدم. إذا كان قد قام بتعيين٪ Java_home٪ كمتغير بيئة مستخدم ولكنه بدلاً من ذلك يقوم بتغيير المتغير الشامل ، فلن يرى أي فرق.
إضافة متغيرات البيئة أثناء تسجيل الدخول إلى جلسة/وحدة التحكم باستخدام MSTSC.
أعد تشغيل الجهاز وستجد أن متغيرات البيئة ستستمر.
يبدو أن هناك غرابة في O/S اعتمادًا على كيفية اتصالك بالجهاز عند محاولة تغيير متغير البيئة.
تأكد من عدم وجود مسافات في PATH عندما تقوم بتعريف متغيرات بيئة المستخدم الخاصة بك. مثال: C:\GNAT\bin؛ C:\GNAT\include لن تعمل ، بسبب المسافة بين "؛" و "C:\GNAT\include".
لقد واجهت نفس المشكلة ، وأنا أعرف كيفية حلها ، عرجاء لها.
فقط قم بتحرير PATH مرة أخرى ، ولكن لا تقم بإجراء أي تغيير ، وأعد حفظ PATH. لسبب ما هذا يتسبب في إعادة تقييم كل مراجع متغير البيئة المتداخلة.
إذا لم ينجح الأمر ، فقم بذلك مرات قليلة ، بطريقة ما يعمل بنفسه.
PATH هو تسلسل متغير PATH للمستخدم متبوعًا بمتغير PATH العمومي. لاستخدام أحد المتغيرات داخل آخر ، يجب أن تكون الأولى قد تم ضبطها بالفعل. يتم تعيين متغيرات المستخدم قبل المتغيرات العامة (على الأقل هنا على نظام التشغيل Windows 7 64 بت) ، وبالتالي لا يمكنك استخدام المتغيرات العامة في متغير PATH الخاص بالمستخدم. بالإضافة إلى ذلك ، يتم تعيين المتغيرات في الترتيب الأبجدي ، لذلك يجب عليك أيضًا وضع ذلك في الاعتبار.
قد يكون مرتبطًا بميزة "توسيع متغير البيئة المتأخرة" (أو عدم توفرها) ، أو ربما يمكنك الاستفادة من هذه الميزة للحصول على حل صحيح دائمًا.
من كمد موجه
set /?
وقراءة القسم الذي يصف "توسيع متغير البيئة المتأخرة" ، والذي يتضمن مثالًا صغيرًا للاختبار
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
إذا لم تحصل على خط الصدى ، فقد يفسر ذلك ...
ومع ذلك ، إذا قمت ببدء تشغيل cmd.exe بخيار/V ، فيمكنك استخدام "!" بدلا من "٪" ، والذي يغير السلوك
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
بالنسبة لي (يعمل على XP) ، لم يعمل البرنامج النصي الأول ، لكن الإصدار الثاني لم يعمل (مع cmd.exe/V)
أعتقد أن ما فشل Windows في توسيع متغير في PATH لأنه يفكر في ما لم يعرف بعد. يعتبر:
REM Ensure variable is undefined
SET UNDEFINED=
REM And then try to expand it
ECHO UNDEFINED=%UNDEFINED%
تتوافق هذه الفرضية مع ملاحظتي الأخرى - إضافة %ProgramFiles%\Something
إلى المستخدمين PATH
سيؤدي دائمًا إلى توسيع متوقع لـ %ProgramFiles%
، نظرًا لأنه تم تعريفه في بيئة الجهاز في وقت إعلام التغيير المتغير (ترتيب التحميل المستحق - MACHINE ثم USER). ولكن عندما تقوم بتعديل بيئة الجهاز ، يحدث توسع متغير صحيح فقط في وقت التمهيد (الآن ليس لدي أي فكرة كيف و ) لماذا هذا لا يحدث على أساس منتظم).
لقد قمت بحل إعداد متغيرات البيئة في النظام> الإعدادات المتقدمة> متغيرات البيئة .
هناك لوحتان ، المستخدم والمتغيرات العامة (المستخدم هو اسم مستخدم Windows الخاص بك) والمتغيرات النظام هي متغيرات عمومية ، لذلك إذا قمت بتعيين "جديد" من متغيرات المستخدم ، مثل Java_HOME
وقمت بتعيين المسار الخاص بك أدناه ، فستقوم بتعيين المتغيرات حتى إذا كانت لديك مسار يكون ملفات البرنامج داخل المجلد.
ربما كنت تفعل ذلك خطأ؟
حاولت مع نظام التشغيل Windows XP Pro SP3 (32bit). لديّ مسار به عدة مرات من %Java_HOME%
(و %JAVAFX_HOME%
، إلخ). أذهب إلى سطر الأوامر ، اكتب PATH
، أرى المتغيرات موسعة. حسن.
أقوم بتغيير قيمة Java_HOME
. العودة إلى نفس نافذة سطر الأوامر ، PATH
مرة أخرى ، نفس القيمة ... كما هو متوقع (بالتجربة!).
أفتح نافذة سطر أوامر جديدة ، اكتب PATH
، مسكتك ، أرى القيمة الجديدة.
لست متأكدًا من الآلية الدقيقة هناك ، لكن يبدو أن أي برنامج يعمل ، بما في ذلك cmd.exe ، يلتقط قيم متغيرات البيئة في وقت البدء ، ولا ينظر إلى الوراء ... (على الرغم من أنني أعتقد أن برنامجًا جيدًا قد تصرف استمع إلى تغييرات env ، لست متأكدًا للغاية).
قد يُنظر إليه على أنه ميزة أو خطأ أو إزعاج ، ولكن هذه هي الطريقة التي يعمل بها. مرحبًا ، على الأقل ، بخلاف أنظمة Win9X ، لا يتعين علينا إعادة تشغيل الكمبيوتر! وعلى عكس NT Times (IIRC) ، ليس عليك تسجيل الخروج والعودة.
لماذا التناقض؟ طرق مايكروسوفت غامضة ... :-P