it-swarm.asia

Mengapa Windows tidak dapat menangani variabel lingkungan di Path?

Kolega saya dan saya memiliki workstation Dell yang identik dengan Windows XP Edisi Professional x64 diinstal.

Variabel lingkungan Path saya dimulai dengan:

%Java_HOME%\bin;...

Variabel Path kolega saya mencakup direktori yang sama, ditentukan menggunakan variabel lingkungan yang sama, tetapi itu bukan item pertama di Path-nya.

Jika saya mengakses properti sistem -> variabel lingkungan dan mengubah nilai variabel Java_HOME saya, versi Java yang ditemukan dari baris perintah berubah seperti yang saya harapkan. Ini memulai jendela konsol baru, untuk memastikan untuk mengambil perubahan.

Tetapi pada mesin rekan saya, tidak. Dia terus menemukan versi Java-nya yang sebelumnya sampai dia memunculkan variabel Path-nya dan menyimpannya (bahkan jika dia tidak mengubahnya). (Sekali lagi, ini adalah saat memulai jendela konsol baru.)

Saya telah mengamati inkonsistensi ini pada Windows selama sekitar 6 bulan sekarang dan sangat ingin tahu tentang itu. Kami memiliki terlalu banyak versi Windows di kantor kami, jadi jarang saya memiliki kesempatan untuk melihat ini terjadi pada dua mesin yang menjalankan versi OS yang sama persis, sampai sekarang.

Apa yang menyebabkan ini? Mengapa mesinnya tidak mengevaluasi kembali Path, menggunakan Java_HOME yang baru, ketika milik saya melakukannya?

(Apakah itu karena itu bukan hal pertama di Path? Jika demikian, bagaimana mungkin, dan mengapa? Saya akan melakukan lebih banyak tes untuk memeriksa, tapi saya pikir dia sudah muak dengan itu dan ingin kembali bekerja. .)

43
skiphoppy

Jalur Anda adalah gabungan dari jalur sistem yang diikuti oleh jalur pengguna. Selain itu, variabel lingkungan sistem mungkin tidak mengandung referensi ke variabel lingkungan pengguna, dan referensi seperti itu akan tidak diperluas. Untuk mendapatkan hasil yang diinginkan, masukkan referensi ke% Java_HOME% di pengguna variabel lingkungan PATH, atau buat variabel seperti itu jika belum ada.

Mungkin contoh yang disederhanakan akan membuat ini lebih jelas. Misalkan lingkungan SISTEM adalah

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

dan lingkungan Pengguna JSmith adalah

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

maka jalan yang dihasilkan akan menjadi

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

seperti yang diinginkan.

37
JPaget

Periksa di registri Windows di bawah kunci ini:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment

JIKA variabel lingkungan perlu diperluas (di sini:% Java_HOME%)

maka variabel harus ditetapkan sebagai REG_EXPAND_SZ nilai.

Jika menggunakan reg.exe melalui baris perintah untuk menambah/mengedit nilai registri, standarnya adalah untuk ketik REG_SZ. Tentukan jenis REG_EXPAND_SZ dengan menggunakan opsi reg add /t REG_EXPAND_SZ.

15
climenole

Ada masalah yang pasti dengan memperluas variabel lingkungan dalam variabel PATH ketika variabel tersebut diperluas ke jalur yang berisi spasi.

Kami membuat variabel tingkat sistem kami sendiri seperti "OUR_ROOT = c:\MyRoot" dan kemudian menggunakannya dalam sistem PATH seperti "PATH =;% OUR_ROOT%\bin;" dan itu akan diperluas dengan benar ke "PATH =; c:\MyRoot\bin;". Sejauh ini tidak ada masalah.

Tapi, pada Windows 7 (32-bit), saya punya produk menginstal sendiri dan membuat variabel lingkungan sistem seperti ini:

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

dan itu menambahkannya ke variabel sistem PATH:

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

Tetapi nilai PATH yang ditunjukkan dalam CMD mengandung "% STUDIO_BIN%;" dan bukan jalur yang diperluas. Nilai di My Computer> Properties> Advanced> Env.Vars tetap tidak diperluas juga. Ini berarti saya tidak dapat menjalankan program yang membutuhkan DLL dalam direktori itu.

Dengan hanya mengubah STUDIO_BIN (via My Computer> Properties> Advanced ...> Env Vars) ke nama tanpa spasi yang disematkan:

STUDIO_BIN=C:\ProductName\bin

dan kemudian me-restart jendela CMD, PATH sekarang:

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

Solusi lain adalah dengan cukup mengedit variabel sistem yang Anda gunakan dalam PATH menggunakan My Computer> Properties> Advanced ...> Dialog Variabel Lingkungan. Saya mencoba menambahkan karakter dan menghapusnya untuk membuat 'perubahan' dan kemudian OK'd keluar, memulai CMD Prompt baru dan PATH TIDAK diperluas dengan benar. Saya kemudian mencoba menghapus bagian dari jalan itu

STUDIO_BIN=C:\Program Files\Company Name

(menghilangkan "Nama Produk 10.4") dan lihat, dan CMD Prompt berikutnya menunjukkan PATH dengan STUDIO_BIN diperluas dengan benar!

Anehnya, jika saya masuk kembali dan menambahkan "Nama Produk 10.4" ke STUDIO_BIN (termasuk semua ruang yang semula ada sebelum saya mulai bercanda dengannya) dan PATH MASIH diperluas dengan benar.

Terbukti dengan perubahan yang cukup pada isinya, variabel PATH menjalani beberapa pemrosesan ekstra dalam dialog Variabel Lingkungan yang memungkinkannya berfungsi. Pemrosesan yang tidak dilakukan ketika variabel ditambahkan oleh penginstal produk (yang mungkin hanya memodifikasi PATH dalam registri secara langsung).

Saya hampir yakin ini adalah masalah dengan XP juga. Itu hanya muncul kembali untuk saya di Windows 7 karena saya sedang menyusun mesin pengembangan baru. Ternyata itu belum diperbaiki oleh Microsoft.

Rupanya bahkan MS mendefinisikan variabel seperti% ProgramFiles% tidak akan berkembang dengan benar di PATH.

Halaman ini memberikan jawaban yang mungkin jika Anda mengatur PATH melalui file baris perintah atau batch. (Lampirkan seluruh perintah setelah SET dalam tanda kutip.) Saya tidak tahu apa installer produk yang saya instal digunakan untuk mengatur variabel lingkungan, tetapi ternyata berkeliling pengolahan apa pun yang diperlukan untuk memperluas jalur dengan spasi dengan benar.

Jadi - untuk meringkas, Anda dapat:

  • ubah jalur (dan pindahkan semua file terkait) ke jalur tanpa spasi, atau

  • sunting variabel yang gagal untuk diperluas dalam dialog Variabel Lingkungan (mengubahnya cukup untuk membuat mereka memproses dengan benar - saya tidak yakin berapa banyak yang cukup).

9
RobDavenport

saya menanyakan hal ini di forum Microsoft pada bulan Maret 2009, dan tidak pernah menyelesaikannya:

Bagaimana cara menggunakan% ProgramFiles% dalam variabel lingkungan Path? :


Saya mencoba menambahkan folder ke variabel lingkungan Path sistem.

saya ingin menambahkan % ProgramFiles%\SysInternals

ke variabel jalur yang ada:

C:\PROGRA ~ 1\Borland\Delphi5\Projects\Bpl; C:\PROGRA ~ 1\Borland\Delphi5\Bin; % SystemRoot% \system32; % SystemRoot% ;% SystemRoot %\System32\Wbem; C:\Program Files\Microsoft 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:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE \; C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies \;% SYSTEMROOT%\System32\WindowsPowerShell\v1.0 \

Jadi saya pergi ke tempat di mana Anda mengeditnya:

alt text

Dan saya menambahkan variabel saya ke path:

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

Kemudian membuka jendela perintah Prompt baru variabel lingkungan tidak diganti dengan nilai aktualnya:

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

Yang bisa Anda lihat di screenshot berikut:

alt text


Tetapi untuk menjawab pertanyaan Anda: saya tidak tahu. Sepertinya itu tidak bisa dilakukan.

7
Ian Boyd

ada dua level variabel lingkungan, global dan pengguna. Jika ia memiliki% Java_home% ditetapkan sebagai variabel lingkungan pengguna tetapi sebaliknya mengubah yang global, ia tidak akan melihat perbedaan.

5
Sekhat

Tambahkan variabel lingkungan saat masuk ke sesi/konsol menggunakan MSTSC.

Nyalakan ulang mesin dan Anda akan menemukan variabel lingkungan Anda telah bertahan.

Tampaknya ada kekhasan dalam O/S tergantung pada bagaimana Anda terhubung ke mesin ketika Anda mencoba untuk mengubah variabel lingkungan.

2
Justin

Pastikan tidak ada spasi di PATH ketika Anda mendefinisikan variabel lingkungan pengguna Anda sendiri. misalnya: C:\GNAT\bin; C:\GNAT\termasuk tidak akan berfungsi, karena ruang antara ";" dan "C:\GNAT\include".

2
Nij

Saya memiliki masalah yang sama, dan saya tahu cara memperbaikinya, lumpuh.

Cukup edit PATH Anda lagi, tetapi jangan ubah, dan simpan kembali PATH. Untuk beberapa alasan ini menyebabkan semua referensi variabel lingkungan bersarang untuk dievaluasi kembali.

Jika tidak berhasil lakukan beberapa kali lagi, entah bagaimana itu berhasil sendiri.

1
BAP

PATH adalah gabungan dari variabel PATH pengguna diikuti oleh variabel PATH global. Untuk menggunakan satu variabel di dalam yang lain, yang pertama harus sudah diatur. Variabel pengguna ditetapkan sebelum variabel global (setidaknya di sini pada Windows 7 64-bit saya), sehingga Anda tidak dapat menggunakan variabel global dalam variabel PATH pengguna Anda. Selain itu, variabel diatur dalam urutan abjad, sehingga Anda juga harus mengingatnya.

1
cbarrick

Ini mungkin terkait dengan fitur "ekspansi variabel lingkungan tertunda" (atau ketiadaan), atau mungkin Anda dapat memanfaatkan fitur ini untuk selalu memiliki solusi yang benar.

dari cmd Prompt

set /? 

dan baca bagian yang menjelaskan "ekspansi variabel lingkungan tertunda", yang mencakup contoh kecil untuk diuji

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

Jika Anda tidak mendapatkan garis gema, maka itu mungkin menjelaskannya ...

Namun, jika Anda memulai cmd.exe Anda dengan opsi/V, maka Anda dapat menggunakan "!" bukannya "%", yang mengubah behaivior

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

Bagi saya (berjalan di XP), skrip 1 tidak berfungsi, tetapi versi kedua berhasil (dengan cmd.exe/V)

1
libjack

Saya percaya apa yang Windows gagal untuk memperluas variabel dalam PATH karena berpikir apa yang belum didefinisikan. Mempertimbangkan:

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

Hipotesis ini sesuai dengan pengamatan saya yang lain - menambahkan %ProgramFiles%\Something ke penggunaPATH akan selalu menghasilkan perluasan yang diharapkan dari %ProgramFiles%, mengingat telah didefinisikan dalam lingkungan mesin pada saat pemberitahuan perubahan variabel (karena pemuatan perubahan variabel - karena pesanan pemuatan) - MESIN dan kemudian PENGGUNA). Tetapi ketika Anda memodifikasi lingkungan mesin, ekspansi variabel yang benar hanya terjadi pada saat boot (saat ini saya tidak tahu bagaimana dan mengapa ini tidak terjadi secara teratur).

1
user539484

Saya telah menyelesaikan pengaturan variabel lingkungan di Sistem> Pengaturan Lanjut> Variabel Lingkungan.

Ada dua panel, variabel Pengguna dan Global (pengguna adalah nama pengguna Windows Anda) dan Variabel Sistem adalah variabel Global, jadi jika Anda menetapkan 'Baru' dari variabel Pengguna, seperti Java_HOME dan meletakkan jalur Anda di bawah, Anda akan menetapkan variabel bahkan jika global Anda path memiliki file program di dalam folder.

0
thunder_nemesis

Mungkin Anda salah melakukannya?

Saya mencoba dengan Windows XP Pro SP3 (32bit). Saya memiliki jalur dengan beberapa kemunculan %Java_HOME% (dan %JAVAFX_HOME%, dll.). Saya pergi ke baris perintah, ketik PATH, saya melihat variabel diperluas. Baik.

Saya mengubah nilai Java_HOME. Kembali ke jendela baris perintah yang sama, PATH lagi, nilai yang sama ... seperti yang diharapkan (berdasarkan pengalaman!).

Saya membuka jendela baris perintah baru, ketik PATH, gotcha, saya melihat nilai baru.

Tidak yakin apa mekanisme yang tepat di sana, tetapi tampaknya semua program yang berjalan, termasuk cmd.exe, menangkap nilai variabel lingkungan saat mulai, dan tidak menoleh ke belakang ... (walaupun saya percaya program yang berperilaku baik dapat dengarkan perubahan env, meskipun tidak terlalu yakin).

Mungkin dilihat sebagai fitur atau bug atau gangguan, tetapi begitulah cara kerjanya. Hei, setidaknya, tidak seperti Win9X kali, kita tidak perlu me-reboot komputer! Dan tidak seperti waktu NT (IIRC), Anda tidak perlu keluar dan kembali.

Mengapa tidak konsisten? Cara-cara Microsoft tidak dapat dipahami ... :-P

0
PhiLho