Jika saya memodifikasi atau menambahkan variabel lingkungan saya harus memulai kembali command prompt. Apakah ada perintah yang bisa saya jalankan yang akan melakukan ini tanpa me-restart CMD?
windows
cmd
environment-variables
Eric Schoonover
sumber
sumber
Jawaban:
Anda dapat menangkap variabel lingkungan sistem dengan skrip vbs, tetapi Anda memerlukan skrip kelelawar untuk benar-benar mengubah variabel lingkungan saat ini, jadi ini adalah solusi gabungan.
Buat file bernama
resetvars.vbs
mengandung kode ini, dan simpan di jalur:buat nama file lain resetvars.bat yang berisi kode ini, lokasi yang sama:
Saat Anda ingin me-refresh variabel lingkungan, jalankan saja
resetvars.bat
Apologetika :
Dua masalah utama yang saya temukan dengan solusi ini adalah
Sebuah. Saya tidak dapat menemukan cara mudah untuk mengekspor variabel lingkungan dari skrip vbs kembali ke command prompt, dan
b. variabel lingkungan PATH adalah gabungan dari pengguna dan variabel sistem PATH.
Saya tidak yakin apa aturan umum untuk variabel yang saling bertentangan antara pengguna dan sistem, jadi saya memilih untuk membuat sistem menimpa pengguna, kecuali dalam variabel PATH yang ditangani secara khusus.
Saya menggunakan vbs aneh + kelelawar + mekanisme kelelawar sementara untuk mengatasi masalah mengekspor variabel dari vbs.
Catatan : skrip ini tidak menghapus variabel.
Ini mungkin bisa diperbaiki.
TAMBAH
Jika Anda perlu mengekspor lingkungan dari satu jendela cmd ke jendela lain, gunakan skrip ini (sebut saja
exportvars.vbs
):Jalankan
exportvars.vbs
di jendela yang ingin Anda ekspor dari , kemudian beralih ke jendela Anda ingin ekspor ke , dan jenis:sumber
Inilah yang digunakan Chocolatey.
https://github.com/chocolatey/choco/blob/master/src/chocolatey.resources/redirects/RefreshEnv.cmd
sumber
RefreshEnv
untuk mendapatkan variabel lingkungan yang diperbarui ke sesi Anda saat ini.Powershell
juga? Sepertinya hanya berfungsicmd.exe
untuk saya.Pada Windows 7/8/10, Anda dapat menginstal Chocolatey, yang memiliki skrip untuk bawaan ini.
Setelah menginstal Chocolatey, ketik saja
refreshenv
.sumber
Secara desain tidak ada yang dibangun di mekanisme untuk Windows untuk menyebarkan variabel lingkungan add / perubahan / remove ke cmd.exe sudah berjalan, baik dari cmd.exe lain atau dari "My Computer -> Properties -> Advanced Settings -> Variabel Lingkungan ".
Jika Anda memodifikasi atau menambahkan variabel lingkungan baru di luar lingkup prompt perintah terbuka yang ada, Anda harus memulai kembali prompt perintah, atau, secara manual menambahkan menggunakan SET dalam prompt perintah yang ada.
The terbaru Jawaban yang diterima menunjukkan kerja-sekitar parsial secara manual menyegarkan semua variabel lingkungan dalam sebuah naskah. Script menangani kasus penggunaan mengubah variabel lingkungan secara global di "My Computer ... Variabel Lingkungan", tetapi jika variabel lingkungan diubah dalam satu cmd.exe skrip tidak akan menyebarkannya ke cmd.exe lain yang sedang berjalan.
sumber
Saya menemukan jawaban ini sebelum akhirnya menemukan solusi yang lebih mudah.
Cukup restart
explorer.exe
di Task Manager.Saya tidak menguji, tetapi Anda mungkin juga perlu membuka kembali command prompt Anda.
Kredit untuk Timo Huovinen di sini: Node tidak dikenali meskipun berhasil dipasang (jika ini membantu Anda, silakan berikan kredit komentar orang ini).
sumber
cmd
jendela sebagai Administrator. Gunakan perintahtaskkill /f /im explorer.exe && explorer.exe
. Ini akan mematikan proses explorer.exe dan memulai kembali.Ini bekerja di windows 7:
SET PATH=%PATH%;C:\CmdShortcuts
diuji dengan mengetik echo% PATH% dan berhasil, baik. juga mengatur jika Anda membuka cmd baru, tidak perlu lagi reboot yang sial :)
sumber
setx
karena mewarisi lingkungan saat ini yang mungkin memiliki variabel yang telah dimodifikasi dan bukan yang saya inginkan secara permanen. Melakukannya dengan cara ini memungkinkan saya untuk menghindari me-restart konsol untuk menggunakan variabel, sambil menghindari masalah karena tidak tersedia konsol secara global di masa depan.Gunakan "setx" dan restart prompt cmd
Ada alat baris perintah bernama " setx " untuk pekerjaan ini. Ini untuk membaca dan menulis variabel env. Variabel tetap ada setelah jendela perintah telah ditutup.
"Membuat atau memodifikasi variabel lingkungan di lingkungan pengguna atau sistem, tanpa memerlukan pemrograman atau skrip. Setx Perintah juga mengambil nilai-nilai kunci registri dan menulisnya ke file teks."
Catatan: variabel yang dibuat atau dimodifikasi oleh alat ini akan tersedia di jendela perintah di masa mendatang tetapi tidak di jendela perintah CMD.exe saat ini. Jadi, Anda harus memulai ulang.
Jika
setx
tidak ada:Atau modifikasi registri
MSDN mengatakan:
sumber
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\VARIABLE
pengguna saat ini:HKEY_CURRENT_USER\Environment\VARIABLE
%PATH%
makasetx
dapat memotong ini hingga 1024 byte! Dan begitu saja, malamnya menghilangMemanggil fungsi ini berhasil bagi saya:
sumber
Metode terbaik yang saya temukan adalah dengan hanya melakukan permintaan Registry. Ini contoh saya.
Dalam contoh saya, saya melakukan instalasi menggunakan file Batch yang menambahkan variabel lingkungan baru. Saya perlu melakukan hal-hal dengan ini segera setelah instalasi selesai, tetapi tidak dapat menelurkan proses baru dengan variabel-variabel baru. Saya menguji memunculkan jendela explorer lain dan memanggil kembali ke cmd.exe dan ini bekerja tetapi pada Vista dan Windows 7, Explorer hanya berjalan sebagai contoh tunggal dan biasanya sebagai orang yang login. Ini akan gagal dengan otomatisasi karena saya perlu admin saya percaya untuk melakukan hal-hal terlepas dari menjalankan dari sistem lokal atau sebagai administrator di kotak. Keterbatasan untuk ini adalah bahwa ia tidak menangani hal-hal seperti path, ini hanya bekerja pada variabel lingkungan sederhana. Ini memungkinkan saya untuk menggunakan batch untuk menuju ke direktori (dengan spasi) dan menyalin file yang menjalankan .exes dan lain-lain. Ini ditulis hari ini dari sumber daya Mei di stackoverflow.com
Panggilan Batch Asli ke Batch baru:
testenvget.cmd SDROOT (atau apa pun variabelnya)
Juga ada metode lain yang saya dapatkan dari berbagai ide berbeda. Silahkan lihat di bawah ini. Ini pada dasarnya akan mendapatkan variabel path terbaru dari registri namun, ini akan menyebabkan sejumlah masalah karena permintaan registri akan memberikan variabel dalam dirinya sendiri, itu berarti di mana-mana ada variabel ini tidak akan berfungsi, jadi untuk mengatasi masalah ini saya pada dasarnya menggandakan jalan. Sangat jahat. Metode yang lebih disukai adalah: Set Path =% Path%; C: \ Program Files \ Software .... \
Apapun di sini adalah file batch baru, harap berhati-hati.
sumber
Cara termudah untuk menambahkan variabel ke path tanpa me-reboot untuk sesi saat ini adalah membuka command prompt dan ketik:
dan tekan enter .
untuk memeriksa apakah variabel Anda dimuat, ketikkan
dan tekan enter. Namun, variabel hanya akan menjadi bagian dari jalan sampai Anda reboot.
sumber
Dimungkinkan untuk melakukan ini dengan menimpa Tabel Lingkungan dalam proses yang ditentukan itu sendiri.
Sebagai bukti konsep, saya menulis aplikasi sampel ini, yang baru saja mengedit satu variabel lingkungan (dikenal) dalam proses cmd.exe:
Output sampel:
Catatan
Pendekatan ini juga akan terbatas pada pembatasan keamanan. Jika target dijalankan pada ketinggian yang lebih tinggi atau akun yang lebih tinggi (seperti SISTEM) maka kami tidak akan memiliki izin untuk mengedit memorinya.
Jika Anda ingin melakukan ini pada aplikasi 32-bit, offset kode keras di atas akan berubah menjadi masing-masing 0x10 dan 0x48. Offset ini dapat ditemukan dengan membuang struktur _PEB dan _RTL_USER_PROCESS_PARAMETERS dalam debugger (misalnya di WinDbg
dt _PEB
dandt _RTL_USER_PROCESS_PARAMETERS
)Untuk mengubah proof-of-concept menjadi apa yang dibutuhkan OP, itu hanya akan menyebutkan sistem saat ini dan variabel lingkungan pengguna (seperti didokumentasikan oleh jawaban @ tsadok) dan menulis seluruh tabel lingkungan ke dalam memori proses target.
Sunting: Ukuran blok lingkungan juga disimpan dalam struktur _RTL_USER_PROCESS_PARAMETERS, tetapi memori dialokasikan pada tumpukan proses. Jadi dari proses eksternal kita tidak akan memiliki kemampuan untuk mengubah ukurannya dan membuatnya lebih besar. Saya bermain-main dengan menggunakan VirtualAllocEx untuk mengalokasikan memori tambahan dalam proses target untuk penyimpanan lingkungan, dan dapat mengatur dan membaca tabel yang sama sekali baru. Sayangnya setiap upaya untuk mengubah lingkungan dari cara normal akan macet dan terbakar karena alamat tidak lagi menunjuk ke tumpukan (itu akan macet di RtlSizeHeap).
sumber
Variabel lingkungan disimpan di HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet \ Control \ Session Manager \ Environment.
Banyak vars berguna, seperti Path, disimpan sebagai REG_SZ. Ada beberapa cara untuk mengakses registri termasuk REGEDIT:
REGEDIT /E <filename> "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment"
Output dimulai dengan angka ajaib. Jadi untuk mencarinya dengan perintah find perlu diketik dan dialihkan:
type <filename> | findstr -c:\"Path\"
Jadi, jika Anda hanya ingin me-refresh variabel path di sesi perintah Anda saat ini dengan apa yang ada di properti sistem script batch berikut berfungsi dengan baik:
RefreshPath.cmd:
sumber
Coba buka prompt perintah baru sebagai administrator. Ini bekerja untuk saya di Windows 10. (Saya tahu ini adalah jawaban lama, tetapi saya harus membagikan ini karena harus menulis skrip VBS hanya untuk ini tidak masuk akal).
sumber
Restart explorer melakukan ini untuk saya, tetapi hanya untuk terminal cmd baru.
Terminal yang saya setel path sudah dapat melihat variabel Path baru (di Windows 7).
sumber
Yang membingungkan mungkin ada beberapa tempat untuk memulai cmd dari. Dalam kasus saya, saya menjalankan cmd dari windows explorer dan variabel lingkungan tidak berubah ketika memulai cmd dari "run" (windows key + r) variabel lingkungan diubah .
Dalam kasus saya, saya hanya harus mematikan proses windows explorer dari task manager dan kemudian restart lagi dari task manager .
Setelah saya melakukan ini, saya memiliki akses ke variabel lingkungan baru dari cmd yang muncul dari windows explorer.
sumber
Saya menggunakan kode berikut dalam skrip batch saya:
Dengan menggunakan SET setelah SETX dimungkinkan untuk menggunakan variabel "lokal" secara langsung tanpa memulai kembali jendela perintah. Dan pada proses selanjutnya, variabel lingkungan akan digunakan.
sumber
Saya menyukai pendekatan yang diikuti oleh cokelat, seperti yang diposting dalam jawaban pengecut anonim, karena itu adalah pendekatan batch murni. Namun, ia meninggalkan file sementara dan beberapa variabel sementara tergeletak di sekitar. Saya membuat versi yang lebih bersih untuk diri saya sendiri.
Buat file di
refreshEnv.bat
suatu tempat di blog AndaPATH
. Refresh lingkungan konsol Anda dengan mengeksekusirefreshEnv
.sumber
Jika hanya menyangkut satu (atau beberapa) vars spesifik yang ingin Anda ubah, saya pikir cara termudah adalah solusinya : cukup atur di lingkungan Anda DAN di sesi konsol Anda saat ini
Saya memiliki skrip batch sederhana ini untuk mengubah Maven saya dari Java7 ke Java8 (keduanya env. Vars) Batch-folder berada di PATH var saya sehingga saya selalu dapat memanggil ' j8 ' dan di dalam konsol saya dan di lingkungan var JAVA_HOME saya diubah:
j8.bat:
Sampai sekarang saya menemukan ini berfungsi terbaik dan termudah. Anda mungkin ingin ini berada dalam satu perintah, tetapi tidak ada di Windows ...
sumber
Solusi yang saya gunakan selama beberapa tahun sekarang:
Sunting: Woops, ini versi terbaru.
sumber
Tidak ada jalan lurus, seperti kata Kev. Dalam kebanyakan kasus, lebih mudah untuk menelurkan kotak CMD lain. Lebih menjengkelkan, menjalankan program juga tidak menyadari perubahan (meskipun IIRC mungkin ada pesan siaran yang harus diperhatikan untuk diberitahu tentang perubahan tersebut).
Ini lebih buruk: di versi Windows yang lebih lama, Anda harus keluar lalu masuk kembali untuk memperhitungkan perubahan ...
sumber
Saya menggunakan skrip Powershell ini untuk menambah variabel PATH . Dengan sedikit penyesuaian, ini dapat bekerja dalam kasus Anda juga, saya percaya.
sumber
Terima kasih telah mengirimkan pertanyaan ini yang cukup menarik, bahkan pada tahun 2019 (Memang, tidak mudah untuk memperbarui shell cmd karena ini adalah contoh tunggal seperti yang disebutkan di atas), karena memperbarui variabel lingkungan di windows memungkinkan untuk menyelesaikan banyak tugas otomatisasi tanpa harus me-restart baris perintah secara manual.
Sebagai contoh, kami menggunakan ini untuk memungkinkan perangkat lunak untuk digunakan dan dikonfigurasi pada sejumlah besar mesin yang kami instal ulang secara teratur. Dan saya harus mengakui bahwa harus me-restart baris perintah selama penyebaran perangkat lunak kami akan sangat tidak praktis dan akan meminta kami untuk menemukan solusi yang tidak selalu menyenangkan. Mari kita selesaikan masalah kita. Kami melanjutkan sebagai berikut.
1 - Kami memiliki skrip batch yang pada gilirannya memanggil skrip PowerShell seperti ini
[file: task.cmd] .
cmd
> powershell.exe -executionpolicy unrestricted -File C:\path_here\refresh.ps1
2 - Setelah ini, skrip refresh.ps1 memperbarui variabel lingkungan menggunakan kunci registri (GetValueNames (), dll.). Kemudian, dalam skrip powershell yang sama, kita hanya perlu memanggil variabel lingkungan baru yang tersedia. Sebagai contoh, dalam kasus khusus, jika kita baru saja menginstal nodeJS sebelum dengan cmd menggunakan perintah diam, setelah fungsi dipanggil, kita dapat langsung memanggil npm untuk menginstal, dalam sesi yang sama, paket-paket tertentu seperti berikut.
[file: refresh.ps1]
Setelah skrip powershell selesai, skrip cmd melanjutkan dengan tugas lain. Sekarang, satu hal yang perlu diingat adalah bahwa setelah tugas selesai, cmd masih belum memiliki akses ke variabel lingkungan baru, bahkan jika skrip powershell telah memperbarui mereka dalam sesi sendiri. Itulah sebabnya kami melakukan semua tugas yang diperlukan dalam skrip powershell yang dapat memanggil perintah yang sama seperti cmd, tentu saja.
sumber
Sunting: ini hanya berfungsi jika perubahan lingkungan yang Anda lakukan adalah akibat menjalankan file batch.
Jika file batch dimulai dengan
SETLOCAL
itu maka akan selalu terurai kembali ke lingkungan asli Anda saat keluar bahkan jika Anda lupa meneleponENDLOCAL
sebelum batch keluar, atau jika dibatalkan secara tak terduga.Hampir setiap file batch yang saya tulis dimulai dengan
SETLOCAL
karena dalam kebanyakan kasus saya tidak ingin efek samping dari perubahan lingkungan tetap ada. Dalam kasus di mana saya ingin perubahan variabel lingkungan tertentu untuk menyebar di luar file batch maka yang terakhir sayaENDLOCAL
terlihat seperti ini:sumber
Untuk mengatasi ini saya telah mengubah variabel lingkungan menggunakan KEDUA setx dan set, dan kemudian restart semua contoh explorer.exe. Dengan cara ini, setiap proses yang dimulai kemudian akan memiliki variabel lingkungan baru.
Skrip batch saya untuk melakukan ini:
Masalah dengan pendekatan ini adalah bahwa semua jendela explorer yang saat ini dibuka akan ditutup, yang mungkin merupakan ide yang buruk - Tetapi lihat posting oleh Kev untuk mempelajari mengapa ini diperlukan
sumber