Saya telah menemukan bahwa pengaturan variabel lingkungan PATH hanya memengaruhi prompt perintah lama. PowerShell tampaknya memiliki pengaturan lingkungan yang berbeda. Bagaimana cara mengubah variabel lingkungan untuk PowerShell (v1)?
catatan:
Saya ingin membuat perubahan saya permanen, jadi saya tidak perlu mengaturnya setiap kali saya menjalankan PowerShell. Apakah PowerShell memiliki file profil? Sesuatu seperti profil Bash di Unix?
windows
powershell
Vasil
sumber
sumber
"
) dalam variabel lingkungan path$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
Jawaban:
Mengubah variabel lingkungan aktual dapat dilakukan dengan menggunakan
env: namespace / drive
informasi. Misalnya, kode ini akan memperbarui variabel lingkungan jalur:Ada beberapa cara untuk membuat pengaturan lingkungan permanen, tetapi jika Anda hanya menggunakannya dari PowerShell, mungkin jauh lebih baik menggunakan profil Anda untuk memulai pengaturan. Saat startup, PowerShell akan menjalankan file .ps1 yang ditemukannya di
WindowsPowerShell
direktori di bawah folder My Documents. Biasanya Anda memiliki file profile.ps1 sudah ada di sana. Path di komputer saya adalahsumber
C:\path\to\file.ext
variabel lingkungan? EDIT: sudah menemukannya. Jawabannya adalah ya, buat itu. File harus terdiri dari 1 baris:$env:path += ;C:\path\to\file.ext"
.$env:Path = "SomeRandomPath";
Sebagai gantinya - lihat @mloskot, di bawah.Jika, beberapa saat selama sesi PowerShell, Anda perlu menambahkan variabel lingkungan PATH untuk sementara, Anda dapat melakukannya dengan cara ini:
sumber
$env:Path = "C:\MyPath;$env:Path"
Anda juga dapat memodifikasi variabel lingkungan pengguna / sistem secara permanen (yaitu akan bertahan di seluruh shell restart) dengan yang berikut ini:
Ubah variabel lingkungan sistem
Ubah variabel lingkungan pengguna
Penggunaan dari komentar - tambahkan ke variabel lingkungan sistem
Solusi berbasis string juga dimungkinkan jika Anda tidak ingin menulis tipe
sumber
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine)
Anda tidak akan melihat hasil dari perubahan ini sampai Anda memulai sesi PowerShell baru. Yaitu, jika Anda memeriksa $ env: Path segera setelah menjalankan perintah ini, Anda akan melihat apa $ env: Path sebelum perintah. Untuk memperbarui, tutup dan buka shell atau memulai sesi baru.[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
Dari prompt PowerShell:
Anda kemudian akan melihat teks:
Mulai ulang sesi Anda, dan variabel akan tersedia.
setx
juga bisa digunakan untuk mengatur variabel arbitrer. Ketiksetx /?
pada prompt untuk dokumentasi.Sebelum mengacaukan lintasan Anda dengan cara ini, pastikan Anda menyimpan salinan lintasan yang ada dengan melakukannya
$env:path >> a.out
di prompt PowerShell.sumber
$env:PATH
terlebih dahulu, lalusetx /m PATH "$env:PATH"
diterapkan secara lokal dan global tanpa shell restart?Seperti jawaban JeanT , saya ingin abstraksi untuk menambahkan jalan. Tidak seperti jawaban JeanT, saya membutuhkannya untuk berjalan tanpa interaksi pengguna. Perilaku lain yang saya cari:
$env:Path
sehingga perubahan berlaku di sesi saat iniDalam hal ini berguna, ini dia:
Lihat intisari saya untuk
Remove-EnvPath
fungsi yang sesuai .sumber
Meskipun jawaban yang diterima saat ini berfungsi dalam arti bahwa variabel path akan diperbarui secara permanen dari konteks PowerShell, itu tidak benar-benar memperbarui variabel lingkungan yang disimpan dalam registri Windows.
Untuk mencapai itu, Anda jelas dapat menggunakan PowerShell juga:
Informasi lebih lanjut ada di posting blog Gunakan PowerShell untuk Memodifikasi Path Lingkungan Anda
Jika Anda menggunakan ekstensi komunitas PowerShell, perintah yang tepat untuk menambahkan jalur ke jalur variabel lingkungan adalah:
sumber
Semua jawaban yang menyarankan perubahan permanen memiliki masalah yang sama: Mereka memecahkan nilai registri jalur.
SetEnvironmentVariable
mengubahREG_EXPAND_SZ
nilai%SystemRoot%\system32
menjadiREG_SZ
nilaiC:\Windows\system32
.Variabel lain di jalur juga hilang. Menambahkan yang baru menggunakan
%myNewPath%
tidak akan bekerja lagi.Berikut ini skrip
Set-PathVariable.ps1
yang saya gunakan untuk mengatasi masalah ini:Saya menjelaskan masalahnya secara lebih rinci dalam posting blog .
sumber
Ini menetapkan jalur untuk sesi saat ini dan meminta pengguna untuk menambahkannya secara permanen:
Anda dapat menambahkan fungsi ini ke profil default Anda, (
Microsoft.PowerShell_profile.ps1
), biasanya terletak di%USERPROFILE%\Documents\WindowsPowerShell
.sumber
Membangun jawaban @Michael Kropat, saya menambahkan parameter untuk menambahkan path baru ke
PATH
variabel yang ada dan memeriksa untuk menghindari penambahan path yang tidak ada:sumber
Seperti yang disebutkan oleh Jonathan Leaders di sini , penting untuk menjalankan perintah / skrip yang ditinggikan untuk dapat mengubah variabel lingkungan untuk 'mesin' , tetapi menjalankan beberapa perintah yang ditinggikan tidak harus dilakukan dengan Ekstensi Komunitas, jadi saya ingin untuk memodifikasi dan memperluas jawaban JeanT dengan suatu cara, bahwa mengubah variabel mesin juga dapat dilakukan bahkan jika skrip itu sendiri tidak dijalankan dengan peningkatan:
sumber
Sebagian besar jawaban tidak membahas UAC . Ini mencakup masalah UAC.
Pertama instal Ekstensi Komunitas PowerShell:
choco install pscx
via http://chocolatey.org/ (Anda mungkin harus memulai ulang lingkungan shell Anda).Kemudian aktifkan pscx
Kemudian gunakan
Invoke-Elevated
sumber
Saran saya adalah ini:
Saya telah menguji ini untuk menambah
C:\oracle\x64\bin
variabel lingkunganPath
secara permanen dan ini berfungsi dengan baik.Cara pertama adalah melakukan:
Tetapi perubahan ini tidak permanen.
$env:path
akan kembali ke keadaan semula begitu Anda menutup terminal PowerShell Anda dan membukanya kembali. Itu karena Anda telah menerapkan perubahan di tingkat sesi dan bukan di tingkat sumber (yang merupakan tingkat registri). Untuk melihat nilai global$env:path
, lakukan:Atau lebih khusus:
Sekarang untuk mengubah ini, pertama-tama kita tangkap jalur asli yang perlu dimodifikasi:
Sekarang kita mendefinisikan seperti apa jalan baru itu. Dalam hal ini kami menambahkan folder baru:
Catatan: Pastikan
$newpath
tampilannya seperti yang Anda inginkan. Jika tidak, maka Anda dapat merusak OS Anda.Sekarang terapkan nilai baru:
Sekarang lakukan satu pemeriksaan terakhir yang terlihat seperti yang Anda harapkan:
Anda sekarang dapat me-restart terminal PowerShell Anda (atau bahkan me-reboot mesin) dan melihat bahwa itu tidak mundur ke nilai lamanya lagi.
Perhatikan bahwa urutan jalur dapat berubah sehingga sesuai urutan abjad, jadi pastikan Anda memeriksa seluruh baris. Untuk membuatnya lebih mudah, Anda dapat membagi output menjadi baris dengan menggunakan titik koma sebagai pembatas:
sumber
Buka PowerShell dan jalankan:
sumber
Di dalam PowerShell, seseorang dapat menavigasi ke direktori variabel lingkungan dengan mengetik:
Ini akan membawa Anda ke direktori Env:>. Dari dalam direktori ini:
Untuk melihat semua variabel lingkungan, ketik:
Untuk melihat variabel lingkungan tertentu, ketik:
Untuk mengatur variabel lingkungan, ketik:
Untuk menghapus variabel lingkungan, ketik:
Informasi lebih lanjut ada di About Variabel Lingkungan .
sumber
Saya mencoba sedikit mengoptimalkan kode SBF dan Michael untuk membuatnya lebih ringkas.
Saya mengandalkan paksaan tipe PowerShell di mana secara otomatis mengubah string menjadi nilai enum, jadi saya tidak mendefinisikan kamus pencarian.
Saya juga menarik keluar blok yang menambahkan jalur baru ke daftar berdasarkan kondisi, sehingga pekerjaan dilakukan sekali dan disimpan dalam variabel untuk digunakan kembali.
Ini kemudian diterapkan secara permanen atau hanya untuk Sesi tergantung pada
$PathContainer
parameter.Kita bisa meletakkan blok kode dalam suatu fungsi atau file ps1 yang kita panggil langsung dari command prompt. Saya pergi dengan DevEnvAddPath.ps1.
Saya melakukan sesuatu yang serupa untuk DevEnvRemovePath.ps1.
Sejauh ini, mereka tampaknya berhasil.
sumber
Hanya jawaban yang mendorong nilai ke dalam registri yang memengaruhi perubahan permanen (sehingga sebagian besar jawaban di utas ini, termasuk jawaban yang diterima, tidak memengaruhi secara permanen
Path
).Fungsi berikut berfungsi untuk
Path
/PSModulePath
dan untukUser
/System
jenis. Ini juga akan menambahkan jalur baru ke sesi saat ini secara default.sumber