Windows neden Path içindeki bir ortam değişkenini işleyemiyor?


44

Meslektaşım ve ben Windows XP Professional x 64 sürümü yüklü olan aynı Dell iş istasyonlarına sahibiz.

My Path ortam değişkeni şu şekilde başlar:

%JAVA_HOME%\bin;...

Meslektaşımın Yol değişkeni, aynı ortam değişkeni kullanılarak belirtilen aynı dizini içerir, ancak Yolundaki ilk öğe değildir.

Sistem özelliklerine -> ortam değişkenlerine erişip JAVA_HOME değişkenimin değerini değiştirirsem, komut satırında bulunan java sürümü beklediğim gibi değişir. Bu, değişiklikleri aldığınızdan emin olmak için yepyeni bir konsol penceresi başlatıyor.

Ama meslektaşımın makinesinde, öyle değil. Önceki Java sürümünü bulmaya, Path değişkenini getirene ve kaydetmeden devam eder (üzerinde değişiklik yapmasa bile). (Yine, bu yepyeni bir konsol penceresi başlatırken olur.)

Yaklaşık 6 aydır Windows'taki bu tutarsızlığı gözlemliyorum ve çok merak ediyorum. Ofisimizde çok fazla Windows sürümü var, bu yüzden nadiren şimdiye kadar aynı işletim sistemi sürümünü çalıştıran iki makinede bunu görme şansım oldu.

Buna ne sebep oluyor? Madeni yaptığı zaman, neden makinesi yeni JAVA_HOME kullanarak Path'i yeniden değerlendirmiyor?

(Yoldaki ilk şey olmadığı için mi? Öyleyse, bu nasıl olabilir ve neden? Kontrol etmek için daha fazla test yaparım, ama bence artık bıkmış ve işe geri dönmek istiyor. .)


9
Kapatmanız için oy verdiğiniz tüm çocuklar için (şu anda 3) ... eğer bir yerde dup varsa, beni gösteren bir yorum güzel olurdu. Eğer bir dupe değilse ... o zaman bana bu sorunun yanlış olduğunu düşündüğünüzü söylemek de iyi olurdu.
saat

1
Belki de bir programlama sorusundan çok bir sistem sorusu olduğundan, programlama üzerinde doğrudan bir etkiye sahip olmasına rağmen, bu yüzden onu kapatmak için oy

9
Attenion close-nazis: Eğer superuser.com ve serverfault.com gelmeden önce bir soru Stack Overflow ile ilgili bir soru uygun olsaydı, bugün hala uygun olduğu görüşünü desteklemek isterim. Bu bir programlama sorusudur.
saat

Programcıların yalnızca Windows kullanıcıları olduğu anlamına mı geliyor? Kapa çeneni, programcı-nazi! İkincisi, daha uygun bir soru-cevap sitesi gelmeden önce, burada soru gönderme seçeneğiniz yoktu. SO'nun misafirperverliği, kötüye kullanım için bir argüman olmamalıdır.
Val

Buna Windows 10'da bakıyorum - PATH değişken değişkeninin aralıklı olarak çalışması başarısız oldu . Çevre Değişkenlerine Gitme ve kaydetme (değişiklik yapmadan) ve ardından yeni bir CMD istemi açmak sorunu çözdü.
Thomas W,

Yanıtlar:


37

Yolunuz, kullanıcı yolunun izlediği sistem yolunun birleştirilmesidir. Ayrıca, sistem, ortam değişkenleri kullanıcı ortam değişkenlerine referanslar içerebilir olmayabilir ve bu tür herhangi bir referanslar olacak olup genişletilebilir. İstenilen sonucu elde etmek için, PATH kullanıcı ortamı değişkenine % JAVA_HOME% referansını ekleyin veya mevcut değilse, böyle bir değişken oluşturun.

Belki basitleştirilmiş bir örnek bunu daha açık hale getirecektir. Diyelim ki SİSTEM ortamı

ProgramFiles = C:\Program Files
SystemRoot = C:\WINDOWS
PATH = %SystemRoot%\SYSTEM32

ve Kullanıcı JSmith'in ortamı

JAVA_HOME = %ProgramFiles%\Java\bin
USERPROFILE = C:\USERS\JSmith
PATH = %JAVA_HOME%\bin;%USERPROFILE%\bin

sonra ortaya çıkan yol

C:\WINDOWS\SYSTEM32;C:\Program Files\Java\bin;C:\Users\JSmith\bin

istediğiniz gibi.


3
Sistemim, bazı sistem env değişkenleriyle aynı adı taşıyan bazı kullanıcı env değişkenlerine sahipti. Echoing PATH onları genişletmez - bunu okuduktan sonra, öncelikli olarak alıp almadıklarını merak ettiğimden (ama genişletilemedi) merak edip yinelenen kullanıcı değişkenlerini kaldırdım. Bu şimdi benim için çalıştı - çok teşekkürler. :)
Michael

Powershell'den orjinal açılmamış PATH'i almanın bir yolu var mı? İçindeki genişletilmemiş çevre değişkenlerini koruyarak PATH'ime eklemeyi umuyordum.
CMCDragonkai

Başka bir sorudan yardım alarak çözüldü. Bunu işlemek için bir powershell betiği yazın: gist.github.com/CMCDragonkai/a02d77c2d7c0799dd42fd2aab26a3cd5
CMCDragonkai 23:16

16

Bu anahtarın altındaki Windows kayıt defterinde kontrol edin:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment

Ortam değişkeninin genişletilmesi gerekiyorsa (burada:% JAVA_HOME%)

Daha sonra, değişken olmalıdır bir şekilde ayarlanabilir REG_EXPAND_SZ değeri.

Kayıt defteri değerleri eklemek / düzenlemek için komut satırı üzerinden reg.exe kullanılıyorsa, REG_SZ yazması varsayılan değerdir. reg add /t REG_EXPAND_SZSeçeneği kullanarak REG_EXPAND_SZ türünü belirtin .


evet ... bu her zaman unutmuş göründüğüm ayarlardan biri ... sinir bozucu kayıt defteri ;-)
Eddie B

9

Değişken boşluk içeren bir yola genişlediğinde PATH değişkeni içindeki ortam değişkenlerini genişletmede kesin bir sorun var.

"OUR_ROOT = c: \ MyRoot" gibi kendi sistem seviyesi değişkenlerimizi yarattık ve onu PATH sisteminde "PATH =;% OUR_ROOT% \ bin;" gibi kullandık. ve doğru bir şekilde "PATH =; c: \ MyRoot \ bin;" olarak genişletildi. Şimdiye kadar sorun değil.

Ancak, Windows 7'de (32-bit), bir ürünün kendisini yüklemesini ve bunun gibi sistem ortamı değişkenlerini yaratmasını sağladım:

STUDIO_BIN=C:\program files\Company Name\Product Name 10.4\bin

ve onu sistem PATH değişkenine ekledi:

PATH=<other path elements>;%STUDIO_BIN%;<more path elements>

Ancak CMD'de gösterilen PATH değerleri "% STUDIO_BIN%;" ve genişletilmiş yol değil. Bilgisayarım> Özellikler> Gelişmiş> Env.Vars öğesindeki değer de beklenmeyen şekilde kaldı. Bu, bu dizinde bir DLL gerektiren programları çalıştıramadığım anlamına geliyordu.

Sadece STUDIO_BIN'i (Bilgisayarım> Özellikler> Gelişmiş ...> Env Vars ile) gömülü boşlukları olmayan bir isme değiştirerek:

STUDIO_BIN=C:\ProductName\bin

ve ardından CMD penceresini yeniden başlatarak, PATH şimdi:

PATH=<other path elements>;C:\ProductName\bin;<more path elements>

Başka bir çözüm de Bilgisayarım> Özellikler> Gelişmiş ...> Ortam Değişkenleri iletişim kutusunu kullanarak PATH'ta kullandığınız sistem değişkenini yeterince düzenlemektir. Bir karakter eklemeye ve onu 'değişiklik' yapmak için çıkarmaya çalıştım ve sonra Tamam'ı tıkladım, yeni bir CMD istemi başlattım ve PATH doğru şekilde genişletilmedi. Sonra yolun bir kısmını silmeyi denedim

STUDIO_BIN=C:\Program Files\Company Name

("Ürün Adı 10.4" çıkarılarak) ve görüldüğü gibi, bir sonraki CMD isteminde PATH, STUDIO_BIN ile düzgün şekilde genişletildiğini gösterdi!

Garip bir şekilde, tekrar girip "Ürün Adı 10.4" ü STUDIO_BIN'e ekledim (STUDO_BIN'e orijinal olarak orda olan tüm alanları da dahil ettim), PATH STILL doğru bir şekilde genişletildi.

İçeriğinde yeterince değişiklik olduğu açıkça belli olan PATH değişkeni, Ortam Değişkenleri iletişim kutusunda çalışmasına izin veren bazı ek işlemlerden geçirir. Değişken, ürün yükleyicisi tarafından eklendiğinde yapılan işlem (muhtemelen PATH doğrudan kayıt defterinde değiştirilmiştir).

Neredeyse pozitifim, bu XP'de de bir sorun oldu. Yeni bir geliştirme makinesi oluşturduğum için Windows 7'de benim için yeni ortaya çıktı. Görünüşe göre Microsoft tarafından düzeltilmedi.

Görünüşe göre,% ProgramFiles% gibi MS tanımlı değişkenler bile PATH içinde doğru şekilde genişlemiyor.

Bu sayfa , PATH komut satırı veya toplu iş dosyası üzerinden ayarlanıyorsa olası bir yanıt sunar. (SET komutundan sonra komutun tamamını tırnak işaretleri içine alın.) Kurulduğum ürünün hangi yükleyiciyi ortam değişkenlerini belirlemek için kullandığını bilmiyorum, ancak boşlukları olan yolları düzgün şekilde genişletmek için hangi işlemlerin yapılması gerektiği açıkça belliydi.

Yani - özetlemek için, ya:

  • yolları değiştir (ve tüm ilişkili dosyaları taşı) boşluk içermeyen yollara

  • Ortam Değişkenleri iletişim kutusundaki genişletilemeyen değişkenleri düzenleyin (doğru şekilde işlemlerini sağlamak için yeterince değiştirme - ne kadar pozitif olduğumdan emin değilim).


7

Bunu Mart 2009'da Microsoft forumlarında sordum ve çözmedim:

% PathFiles% Path ortam değişkeni içinde nasıl kullanılır? :


Sistemin Path ortam değişkenine bir klasör eklemeye çalışıyorum.

% ProgramFiles% \ SysInternals eklemek istiyorum

mevcut yol değişkenine:

C: \ PROGRA ~ 1 \ Borland \ Delphi5 \ Projects \ BPL; C: \ PROGRA ~ 1 \ Borland \ Delphi5 \ Bin; % SystemRoot% \ system32; % SystemRoot% ;% SystemRoot % \ System32 \ Wbem; C: \ Program Dosyaları \ Microsoft SQL Server \ 80 \ Araçlar \ BINN; C: \ Program Dosyaları \ Microsoft SQL Server \ 80 \ Araçlar \ Binn \; C: \ Program Files \ Microsoft SQL Server \ 90 \ Araçlar \ binn \; C: \ Program Dosyaları \ Microsoft SQL Server \ 90 \ DTS \ Binn \; C: \ Program Dosyaları \ Microsoft SQL Server \ 90 \ Araçlar \ Binn \ VSShell \ Common7 \ IDE \; C: \ Program Dosyaları \ Microsoft Visual Studio 8 \ Common7 \ IDE \ PrivateAssemblies \;% SYSTEMROOT % \ System32 \ WindowsPowerShell \ v1.0 \

Bu yüzden düzenlediğiniz yere giriyorum:

alt metin

Ve değişkenimi yola ekledim:

% ProgramFiles % \ SysInternals; C: \ PROGRA ~ 1 \ Borland \ Delphi5 \ Projects \ Bpl; (kesik)

Daha sonra yeni bir komut istemi penceresi açarken, ortam değişkeni gerçek değeri ile değiştirilmez:

Yol =% ProgramFiles % \ SysInternals; C: \ PROGRA ~ 1 \ Borland \ Delphi5 \ Projeler \ Bpl (snip)>

Aşağıdaki ekran görüntüsünde görebileceğinizler:

alt metin


Ama sorunuzu cevaplamak için: bilmiyorum. Yapılamaz gibi görünüyor.


5

Global ve kullanıcı olmak üzere iki ortam değişkeni seviyesi vardır. Bir kullanıcı ortamı değişkeni olarak ayarlanmış% Java_home% değeri varsa, bunun yerine genel olanı değiştiriyorsa, hiçbir fark görmez.


2

Kendi kullanıcı ortamı değişkenlerinizi tanımlarken PATH'ta boşluk olmadığından emin olun. örneğin: C: \ GNAT \ bin; C: \ GNAT \, ";" arasındaki boşluktan dolayı işe yaramaz işleri içerir. ve "C: \ GNAT \ include".


2

MSTSC kullanarak / console oturumuna giriş yaparken ortam değişkenlerini ekleyin.

Makineyi yeniden başlatın ve ortam değişkenlerinizin devam edeceğini göreceksiniz.

Ortam değişkenini değiştirmeye çalıştığınızda makineye nasıl bağlandığınıza bağlı olarak O / S'de bir tuhaflık var gibi görünüyor.


1

"Gecikmeli ortam değişken genişlemesi" özelliği (veya bunların eksikliği) ile ilişkili olabilir veya belki de her zaman doğru bir çözüme sahip olmak için bu özellikten yararlanabilirsiniz.

cmd komut isteminden

set /? 

ve test etmek için küçük bir örnek içeren "gecikmeli ortam değişken genişlemesi" ni açıklayan bölümü okuyun.

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)

Yankı çizgisini alamazsanız, bu açıklayabilir ...

Bununla birlikte, cmd.exe'nizi / V seçeneğiyle başlatırsanız, "!" davranışını değiştiren "%" yerine

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

Benim için (XP'de çalışıyor), 1. komut dosyası işe yaramadı, ancak ikinci versiyon (cmd.exe / V ile) çalıştı


1

Aynı problemi yaşadım ve nasıl çözüleceğini biliyorum.

Sadece PATH'inizi yeniden düzenleyin, ancak değişiklik yapmayın ve PATH’i yeniden kaydedin. Nedense bu, iç içe geçmiş tüm ortam değişken başvurularının yeniden değerlendirilmesine neden olur.

İşe yaramazsa, birkaç kez daha yapın, bir şekilde sadece kendi kendine çalışır.


1

Henüz Windows’un PATH’deki bir değişkeni genişletemediğine inanıyorum. Düşünmek:

REM Ensure variable is undefined
SET UNDEFINED=
REM And then try to expand it
ECHO UNDEFINED=%UNDEFINED%

Bu hipotez, diğer gözlemlerime uyuyor - kullanıcılara eklenmesi , değişken değişim bildirimi sırasında makine ortamında tanımlandığı taktirde (gerekli yükleme sırası - MACHINE ve ardından KULLANICI) %ProgramFiles%\Something, kullanıcılara PATH her zaman beklenen genişlemeyle sonuçlanacaktır %ProgramFiles%. Eğer makine ortam doğru değişken genişleme değiştirmek Ama boot zamanında olur (şu anda hiçbir fikrim yok nasıl ve niçin bu değil düzenli olarak gerçekleşir).


1

Girişte değişkenlerin ayarlanma sırasını göz önünde bulundurmalısınız. Bir değişkeni ayarlanmadan önce kullanmaya çalışırsanız, boş dize olarak çıkar.

Etkili PATH, kullanıcının PATH değişkeninin ardından global PATH değişkeninin bir araya getirilmesidir.

Kullanıcı değişkenleri genel değişkenlerden önce ayarlanır, bu nedenle siz de kullanıcı PATH değişkeninde global değişkenleri kullanamazsınız. Ek olarak, değişkenler alfabetik sıraya göre ayarlanır, böylece PATH'den önce sıralanan değişkenleri kullanamazsınız.

(Bu en azından Windows 7 için geçerlidir. Bunu daha yeni sürümlerde test etmedim.)


0

Belki de yanlış yapıyorsun?

Windows XP Pro SP3'ü (32bit) denedim. Birkaç %JAVA_HOME%(ve %JAVAFX_HOME%, vb.) Oluşumları olan bir yolum var . Komut satırına gidiyorum PATH, yazıyorum, değişkenlerin genişlediğini görüyorum. İyi.

Değerini değiştiriyorum JAVA_HOME. Aynı komut satırı penceresine PATHtekrar, aynı değer ... beklendiği gibi (deneyime göre!).

Yeni bir komut satırı penceresi açarım, yazın PATH, gotcha, yeni değeri görüyorum.

Buradaki mekanizmanın tam olarak ne olduğundan emin değiliz, ancak görünen o ki, cmd.exe de dahil olmak üzere çalışan herhangi bir program, başlangıçtaki ortam değişkenlerinin değerlerini yakalar ve geriye bakmaz. env değişikliklerini dinleyin, gerçi çok da değil).

Bir özellik veya bir hata veya can sıkma olarak görülebilir, ancak bu şekilde çalışır. Hey, en azından Win9X zamanlarının aksine, bilgisayarı yeniden başlatmamız gerekmiyor! Ve NT zamanlarının aksine (IIRC), oturumu kapatıp geri dönmek zorunda değilsiniz.

Neden tutarsızlık? Microsoft'un yolları anlaşılmaz ... :-P


Bu değil. Değişiklikten sonra yeni bir komut penceresinde test ediyoruz. Sistem değerlerini değiştirmenin, çalışan işlemlerin değerlerini değiştirmemesinin farkındayız.
saat

Tamam, bu yüzden 'belki' ... :-) Ve benim açıklamam tutarsızlığı kapsamıyor, ama bazı yeni başlayanlar için yararlı olabilir ...: -PI çoğunlukla değişken genişlemenin yolun her yerinde çalıştığını belirtmek istiyordu. .. bazı sistemler için! (kullandıklarım ... her zaman 32bit).

0

Ortam değişkenlerini Sistem> Gelişmiş Ayarlar> Ortam Değişkenleri ayarında çözdüm .

İki panel vardır, Kullanıcı ve Genel değişkenler (kullanıcı Windows kullanıcı adınızdır) ve Sistem Değişkenleri Genel değişkenlerdir, bu nedenle Kullanıcı değişkenlerinden 'Yeni'yi ayarlarsanız JAVA_HOMEve yolunuzu aşağıya koyarsanız, küresel yolunuz olsa bile değişkenleri ayarlarsınız klasör içerisinde program dosyaları var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.