about_PSModulePath

Deskripsi singkat

Artikel ini menjelaskan tujuan dan penggunaan $env:PSModulePath variabel lingkungan.

Deskripsi panjang

Variabel $env:PSModulePath lingkungan berisi daftar lokasi folder yang dicari untuk menemukan modul dan sumber daya. PowerShell secara rekursif mencari setiap folder untuk file modul (.psd1 atau .psm1) .

Install-Module memiliki parameter Cakupan yang memungkinkan Anda menentukan apakah modul diinstal untuk pengguna saat ini atau untuk semua pengguna. Untuk informasi selengkapnya, lihat Install-Module.

Secara default, lokasi efektif yang ditetapkan $env:PSModulePath adalah:

  • Lokasi di seluruh sistem: Folder ini berisi modul yang dikirim dengan PowerShell. Modul ini disimpan dalam $PSHOME\Modules folder.

    • Di Windows, modul yang diinstal dalam cakupan AllUsers disimpan di $env:ProgramFiles\WindowsPowerShell\Modules.
    • Pada sistem non-Windows, modul yang diinstal dalam cakupan AllUsers disimpan di /usr/local/share/powershell/Modules.
  • Modul yang diinstal pengguna: Pada Windows, modul yang diinstal dalam cakupan CurrentUser biasanya disimpan di $HOME\Documents\WindowsPowerShell\Modules folder. Lokasi Documents spesifik folder bervariasi menurut versi Windows dan saat Anda menggunakan pengalihan folder. Selain itu, Microsoft OneDrive dapat mengubah lokasi folder Anda Documents . Anda dapat memverifikasi lokasi folder Anda Documents menggunakan perintah berikut: [Environment]::GetFolderPath('MyDocuments').

    Pada sistem non-Windows, modul yang diinstal dalam cakupan CurrentUser disimpan di $HOME/.local/share/powershell/Modules folder .

  • Modul khusus aplikasi: Program penyiapan dapat menginstal modul di direktori lain, seperti Program Files folder di Windows. Paket alat penginstal mungkin atau mungkin tidak menambahkan lokasi ke $env:PSModulePath.

Konstruksi PowerShell PSModulePath

Nilai $env:PSModulePath dibangun setiap kali PowerShell dimulai. Nilai bervariasi menurut versi PowerShell dan bagaimana diluncurkan.

Startup Windows PowerShell

Windows PowerShell menggunakan logika berikut untuk membuat PSModulePath saat startup:

  • Jika PSModulePath tidak ada, gabungkan CurrentUser, AllUsers, dan $PSHOME jalur modul
  • Jika PSModulePath ada:
    • Jika PSModulePath berisi $PSHOME jalur modul:
      • Jalur modul AllUsers dimasukkan sebelum $PSHOME jalur modul
    • Lain:
      • Cukup gunakan PSModulePath seperti yang didefinisikan karena pengguna sengaja menghapus $PSHOME lokasi

Jalur modul CurrentUser diawali hanya jika cakupan $env:PSModulePath Pengguna tidak ada. Jika tidak, cakupan $env:PSModulePath Pengguna digunakan sebagaimana didefinisikan.

Startup PowerShell 7

Di Windows, untuk sebagian besar variabel lingkungan, jika variabel Cakupan pengguna ada, proses baru menggunakan nilai tersebut hanya meskipun variabel cakupan Mesin dengan nama yang sama ada.

Di PowerShell 7, PSModulePath diperlakukan mirip dengan bagaimana Path variabel lingkungan diperlakukan di Windows. Pada Windows, Path diperlakukan berbeda dari variabel lingkungan lainnya. Ketika proses dimulai, Windows menggabungkan cakupan Pengguna dengan cakupan PathPathMesin .

  • Mengambil cakupan Pengguna PSModulePath
  • Bandingkan dengan memproses variabel lingkungan yang diwariskan PSModulePath
    • Jika sama:
      • Tambahkan AllUsersPSModulePath ke akhir setelah semantik Path variabel lingkungan
      • Jalur Windows System32 berasal dari komputer yang ditentukan PSModulePath sehingga tidak perlu ditambahkan secara eksplisit
    • Jika berbeda, perlakukan seolah-olah pengguna secara eksplisit memodifikasinya dan tidak menambahkan AllUsersPSModulePath
  • Awalan dengan Pengguna, Sistem, dan $PSHOME jalur PS7 dalam urutan tersebut
    • Jika powershell.config.json berisi pengguna yang terlingkup PSModulePath, gunakan itu alih-alih default untuk pengguna
    • Jika powershell.config.json berisi sistem yang terlingkup PSModulePath, gunakan itu alih-alih default untuk sistem

Sistem Unix tidak memiliki pemisahan variabel lingkungan Pengguna dan Sistem. PSModulePath diwariskan dan jalur khusus PS7 diawali jika belum ditentukan.

Memulai Windows PowerShell dari PowerShell 7

Untuk diskusi ini, Windows PowerShell berarti dan powershell.exepowershell_ise.exe.

Nilai $env:PSModulePath disalin ke WinPSModulePath dengan modifikasi berikut:

  • Menghapus PS7 jalur modul Pengguna
  • Menghapus PS7 jalur modul Sistem
  • Menghapus PS7 $PSHOME jalur modul

Jalur PS7 dihapus sehingga modul PS7 tidak dimuat di Windows PowerShell. Nilai WinPSModulePath digunakan saat memulai Windows PowerShell.

Memulai PowerShell 7 dari Windows PowerShell

Startup PowerShell 7 berlanjut apa adanya dengan penambahan jalur warisan yang ditambahkan Windows PowerShell. Karena jalur khusus PS7 diawali, tidak ada masalah fungsi.

Perilaku pencarian modul

PowerShell secara rekursif mencari setiap folder di file PSModulePath untuk modul (.psd1 atau .psm1) . Pola pencarian ini memungkinkan beberapa versi modul yang sama diinstal di folder yang berbeda. Contohnya:

    Directory: C:\Program Files\WindowsPowerShell\Modules\PowerShellGet

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           8/14/2020  5:56 PM                1.0.0.1
d----           9/13/2019  3:53 PM                2.1.2

Secara default, PowerShell memuat nomor versi tertinggi modul saat beberapa versi ditemukan. Untuk memuat versi tertentu, gunakan Import-Module dengan parameter FullyQualifiedName . Untuk informasi selengkapnya, lihat Import-Module.

Memodifikasi PSModulePath

Untuk sebagian besar situasi, Anda harus menginstal modul di lokasi modul default. Namun, Anda mungkin memiliki kebutuhan untuk mengubah nilai PSModulePath variabel lingkungan.

Misalnya, untuk menambahkan C:\Program Files\Fabrikam\Modules direktori untuk sementara waktu untuk $env:PSModulePath sesi saat ini, ketik:

$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"

Titik koma (;) dalam perintah memisahkan jalur baru dari jalur yang mendahuluinya dalam daftar. Pada platform non-Windows, titik dua (:) memisahkan lokasi jalur dalam variabel lingkungan.

Memodifikasi PSModulePath di non-Windows

Untuk mengubah nilai PSModulePath untuk setiap sesi di lingkungan non-Windows, tambahkan perintah sebelumnya ke profil PowerShell Anda.

Memodifikasi PSModulePath di Windows

Untuk mengubah nilai PSModulePath di setiap sesi, edit kunci registri yang PSModulePath menyimpan nilai. Nilai PSModulePath disimpan dalam registri sebagai string yang tidak tersedia . Untuk menghindari penyimpanan PSModulePath nilai secara permanen sebagai string yang diperluas , gunakan metode GetValue pada subkunji dan edit nilai secara langsung.

Contoh berikut menambahkan C:\Program Files\Fabrikam\Modules jalur ke nilai PSModulePath variabel lingkungan tanpa memperluas string yang tidak diperluas.

$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

Untuk menambahkan jalur ke pengaturan pengguna, ubah penyedia registri dari HKLM:\ ke HKCU:\.

$key = (Get-Item 'HKCU:\').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

Lihat juga