it-swarm.asia

لماذا يتعذر على ويندوز؟

لدي أنا وزميلي محطات عمل Dell متطابقة مع Windows XP الإصدار x64 Professional المثبت.

يبدأ متغير بيئة المسار الخاص بي بـ:

%Java_HOME%\bin;...

يشتمل متغير Path الخاص بزميلي على نفس الدليل المحدد باستخدام متغير البيئة نفسه ، ولكنه ليس العنصر الأول في المسار الخاص به.

إذا قمت بالوصول إلى خصائص النظام -> متغيرات البيئة وقمت بتغيير قيمة متغير Java_HOME ، فإن إصدار Java الموجود من سطر الأوامر يتغير كما أتوقع. هذا هو بدء نافذة وحدة تحكم العلامة التجارية الجديدة ، للتأكد من التقاط التغييرات.

ولكن على آلة زميلي ، لا. يستمر في العثور على نسخته السابقة من Java حتى يقوم بإحضار متغير المسار الخاص به وحفظه (حتى إذا لم يقم بأي تغييرات عليه). (مرة أخرى ، يكون هذا عند بدء تشغيل نافذة وحدة تحكم جديدة تمامًا.)

لقد كنت أراقب هذا التناقض على نظام Windows لمدة 6 أشهر تقريبًا ولدي فضول كبير بشأنه. لدينا الكثير من إصدارات Windows في مكتبنا ، ونادراً ما أتيحت لي فرصة لرؤية هذا يحدث على جهازين يشغلان نفس إصدار نظام التشغيل ، حتى الآن.

لماذا يحدث هذا؟ لماذا لا يقوم الجهاز الخاص به بإعادة تقييم Path ، باستخدام Java_HOME الجديد ، عندما يقوم لي؟

(هل لأنها ليست أول شيء في المسار؟ إذا كان الأمر كذلك ، كيف يمكن أن يكون ، ولماذا؟ سأقوم بإجراء المزيد من الاختبارات للتحقق ، لكنني أعتقد أنه قد سئمت من ذلك الآن وأرغب في العودة إلى العمل .)

43
skiphoppy

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

حسب الرغبة.

37
JPaget

تحقق في سجل ويندوز تحت هذا المفتاح:

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.

15
climenole

توجد مشكلة محددة في توسيع متغيرات البيئة داخل متغير 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 في علامات الاقتباس.) لا أعرف المثبت الذي استخدمه المنتج الذي قمت بتثبيته لتعيين متغيرات البيئة ، ولكن من الواضح أنه تخطى أي معالجة مطلوبة لتوسيع المسارات بمسافات بشكل صحيح.

لذلك - لتلخيص ، يمكنك إما:

  • تغيير المسارات (ونقل جميع الملفات المرتبطة) إلى مسارات دون مسافات ، أو

  • قم بتحرير المتغيرات التي فشلت في التوسع في مربع حوار متغيرات البيئة (تغييرها بما يكفي لجعلها تعمل بشكل صحيح - أنا لست إيجابًا بالقدر الكافي).

9
RobDavenport

لقد طلبت ذلك في منتديات 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 \

لذلك أذهب إلى المكان الذي قمت بتحريره:

alt text

وأضيف المتغير إلى المسار:

٪ PROGRAMFILES ٪\سسنترنلس؛ C:\PROGRA ~ 1\بورلاند\Delphi5\مشاريع\BPL. (قصاصة)

ثم فتح نافذة موجه الأوامر الجديدة ، لا يتم استبدال متغير البيئة بقيمته الفعلية:

مسار =٪ PROGRAMFILES ٪\سسنترنلس؛ C:\PROGRA ~ 1\بورلاند\Delphi5\مشاريع\BPL (قص)>

الذي يمكنك رؤيته في لقطة الشاشة التالية:

alt text


ولكن للإجابة على سؤالك: لا أعرف. يبدو أنه لا يمكن القيام به.

7
Ian Boyd

هناك مستويان من متغيرات البيئة ، العالمية والمستخدم. إذا كان قد قام بتعيين٪ Java_home٪ كمتغير بيئة مستخدم ولكنه بدلاً من ذلك يقوم بتغيير المتغير الشامل ، فلن يرى أي فرق.

5
Sekhat

إضافة متغيرات البيئة أثناء تسجيل الدخول إلى جلسة/وحدة التحكم باستخدام MSTSC.

أعد تشغيل الجهاز وستجد أن متغيرات البيئة ستستمر.

يبدو أن هناك غرابة في O/S اعتمادًا على كيفية اتصالك بالجهاز عند محاولة تغيير متغير البيئة.

2
Justin

تأكد من عدم وجود مسافات في PATH عندما تقوم بتعريف متغيرات بيئة المستخدم الخاصة بك. مثال: C:\GNAT\bin؛ C:\GNAT\include لن تعمل ، بسبب المسافة بين "؛" و "C:\GNAT\include".

2
Nij

لقد واجهت نفس المشكلة ، وأنا أعرف كيفية حلها ، عرجاء لها.

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

إذا لم ينجح الأمر ، فقم بذلك مرات قليلة ، بطريقة ما يعمل بنفسه.

1
BAP

PATH هو تسلسل متغير PATH للمستخدم متبوعًا بمتغير PATH العمومي. لاستخدام أحد المتغيرات داخل آخر ، يجب أن تكون الأولى قد تم ضبطها بالفعل. يتم تعيين متغيرات المستخدم قبل المتغيرات العامة (على الأقل هنا على نظام التشغيل Windows 7 64 بت) ، وبالتالي لا يمكنك استخدام المتغيرات العامة في متغير PATH الخاص بالمستخدم. بالإضافة إلى ذلك ، يتم تعيين المتغيرات في الترتيب الأبجدي ، لذلك يجب عليك أيضًا وضع ذلك في الاعتبار.

1
cbarrick

قد يكون مرتبطًا بميزة "توسيع متغير البيئة المتأخرة" (أو عدم توفرها) ، أو ربما يمكنك الاستفادة من هذه الميزة للحصول على حل صحيح دائمًا.

من كمد موجه

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)

1
libjack

أعتقد أن ما فشل 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). ولكن عندما تقوم بتعديل بيئة الجهاز ، يحدث توسع متغير صحيح فقط في وقت التمهيد (الآن ليس لدي أي فكرة كيف و ) لماذا هذا لا يحدث على أساس منتظم).

1
user539484

لقد قمت بحل إعداد متغيرات البيئة في النظام> الإعدادات المتقدمة> متغيرات البيئة .

هناك لوحتان ، المستخدم والمتغيرات العامة (المستخدم هو اسم مستخدم Windows الخاص بك) والمتغيرات النظام هي متغيرات عمومية ، لذلك إذا قمت بتعيين "جديد" من متغيرات المستخدم ، مثل Java_HOME وقمت بتعيين المسار الخاص بك أدناه ، فستقوم بتعيين المتغيرات حتى إذا كانت لديك مسار يكون ملفات البرنامج داخل المجلد.

0
thunder_nemesis

ربما كنت تفعل ذلك خطأ؟

حاولت مع نظام التشغيل Windows XP Pro SP3 (32bit). لديّ مسار به عدة مرات من %Java_HOME%%JAVAFX_HOME% ، إلخ). أذهب إلى سطر الأوامر ، اكتب PATH ، أرى المتغيرات موسعة. حسن.

أقوم بتغيير قيمة Java_HOME. العودة إلى نفس نافذة سطر الأوامر ، PATH مرة أخرى ، نفس القيمة ... كما هو متوقع (بالتجربة!).

أفتح نافذة سطر أوامر جديدة ، اكتب PATH ، مسكتك ، أرى القيمة الجديدة.

لست متأكدًا من الآلية الدقيقة هناك ، لكن يبدو أن أي برنامج يعمل ، بما في ذلك cmd.exe ، يلتقط قيم متغيرات البيئة في وقت البدء ، ولا ينظر إلى الوراء ... (على الرغم من أنني أعتقد أن برنامجًا جيدًا قد تصرف استمع إلى تغييرات env ، لست متأكدًا للغاية).

قد يُنظر إليه على أنه ميزة أو خطأ أو إزعاج ، ولكن هذه هي الطريقة التي يعمل بها. مرحبًا ، على الأقل ، بخلاف أنظمة Win9X ، لا يتعين علينا إعادة تشغيل الكمبيوتر! وعلى عكس NT Times (IIRC) ، ليس عليك تسجيل الخروج والعودة.

لماذا التناقض؟ طرق مايكروسوفت غامضة ... :-P

0
PhiLho