about_PSModulePath
Description courte
Cet article décrit l’objectif et l’utilisation de la variable d’environnement $env:PSModulePath
.
Description longue
La $env:PSModulePath
variable d’environnement contient une liste d’emplacements de dossiers qui sont recherchés pour rechercher des modules et des ressources. PowerShell recherche de manière récursive les fichiers de module (.psd1
ou .psm1
) dans chaque dossier.
Install-Module
a un paramètre Scope qui vous permet de spécifier si le module est installé pour l’utilisateur actuel ou pour tous les utilisateurs. Pour plus d’informations, consultez Install-Module.
Par défaut, les emplacements effectifs affectés à $env:PSModulePath
sont les suivants :
Emplacements à l’échelle du système : ces dossiers contiennent des modules fournis avec PowerShell. Ces modules sont stockés dans le
$PSHOME\Modules
dossier .- Sur Windows, les modules installés dans l’étendue AllUsers sont stockés dans
$env:ProgramFiles\WindowsPowerShell\Modules
. - Sur les systèmes non Windows, les modules installés dans l’étendue AllUsers sont stockés dans
/usr/local/share/powershell/Modules
.
- Sur Windows, les modules installés dans l’étendue AllUsers sont stockés dans
Modules installés par l’utilisateur : sur Windows, les modules installés dans l’étendue CurrentUser sont généralement stockés dans le
$HOME\Documents\WindowsPowerShell\Modules
dossier . L’emplacement spécifique du dossier varie selon laDocuments
version de Windows et le moment où vous utilisez la redirection de dossiers. Microsoft OneDrive peut également modifier l’emplacement de votreDocuments
dossier. Vous pouvez vérifier l’emplacement de votreDocuments
dossier à l’aide de la commande suivante :[Environment]::GetFolderPath('MyDocuments')
.Sur les systèmes non Windows, les modules installés dans l’étendue CurrentUser sont stockés dans le
$HOME/.local/share/powershell/Modules
dossier .Modules spécifiques à l’application : les programmes d’installation peuvent installer des modules dans d’autres répertoires, tels que le
Program Files
dossier sur Windows. Le package d’installation peut ou non ajouter l’emplacement au$env:PSModulePath
.
Construction powerShell PSModulePath
La valeur de $env:PSModulePath
est construite chaque fois que PowerShell démarre.
La valeur varie selon la version de PowerShell et la façon dont il est lancé.
Windows PowerShell démarrage
Windows PowerShell utilise la logique suivante pour construire le PSModulePath
au démarrage :
- Si
PSModulePath
n’existe pas, combinez CurrentUser, AllUsers et les chemins d’accès aux$PSHOME
modules - Si
PSModulePath
existe :- Si
PSModulePath
contient le$PSHOME
chemin des modules :- Le chemin des modules AllUsers est inséré avant
$PSHOME
le chemin des modules
- Le chemin des modules AllUsers est inséré avant
- Autre:
PSModulePath
Utilisez simplement comme défini, car l’utilisateur a délibérément supprimé l’emplacement$PSHOME
- Si
Le chemin du module CurrentUser est préfixé uniquement si l’étendue $env:PSModulePath
Utilisateur n’existe pas. Sinon, l’étendue $env:PSModulePath
Utilisateur est utilisée comme défini.
Démarrage de PowerShell 7
Dans Windows, pour la plupart des variables d’environnement, si la variable étendue à l’utilisateur existe, un nouveau processus utilise cette valeur uniquement même s’il existe une variable étendue à l’ordinateur du même nom.
Dans PowerShell 7, PSModulePath
est traité de la même façon que la Path
variable d’environnement est traitée sur Windows. Sur Windows, Path
est traité différemment des autres variables d’environnement. Lorsqu’un processus est démarré, Windows combine l’étendue Path
utilisateur avec l’étendue Path
machine.
- Récupérer l’étendue de l’utilisateur
PSModulePath
- Comparer à la variable d’environnement héritée
PSModulePath
de processus- Si identique :
- Ajoutez allUsers
PSModulePath
à la fin en suivant la sémantique de la variable d’environnementPath
- Le chemin Windows
System32
provient de la machine définiePSModulePath
. Il n’est donc pas nécessaire d’ajouter explicitement
- Ajoutez allUsers
- S’il est différent, traitez comme si l’utilisateur l’avait explicitement modifié et n’ajoutez pas AllUsers
PSModulePath
- Si identique :
- Préfixe avec l’utilisateur, le système et
$PSHOME
les chemins d’accès PS7 dans cet ordre- Si
powershell.config.json
contient un étenduePSModulePath
utilisateur , utilisez-le au lieu de la valeur par défaut pour l’utilisateur - Si
powershell.config.json
contient une étenduePSModulePath
système , utilisez-la au lieu de la valeur par défaut pour le système
- Si
Les systèmes Unix n’ont pas de séparation des variables d’environnement Utilisateur et Système.
PSModulePath
est hérité et les chemins spécifiques à PS7 sont préfixés s’ils ne sont pas déjà définis.
Démarrage Windows PowerShell à partir de PowerShell 7
Pour cette discussion, Windows PowerShell signifie à la fois powershell.exe
et powershell_ise.exe
.
La valeur de $env:PSModulePath
est copiée WinPSModulePath
dans avec les modifications suivantes :
- Supprimer PS7 du chemin du module Utilisateur
- Supprimer PS7 le chemin du module système
- Supprimer PS7 du chemin du
$PSHOME
module
Les chemins d’accès PS7 sont supprimés afin que les modules PS7 ne soient pas chargés dans Windows PowerShell. La WinPSModulePath
valeur est utilisée lors du démarrage Windows PowerShell.
Démarrage de PowerShell 7 à partir de Windows PowerShell
Le démarrage de PowerShell 7 se poursuit tel qu’il est avec l’ajout de chemins d’accès qui Windows PowerShell ajoutés. Étant donné que les chemins spécifiques à PS7 sont préfixés, il n’y a aucun problème fonctionnel.
Comportement de recherche de module
PowerShell recherche de manière récursive les fichiers module (.psd1
ou .psm1
) dans chaque dossier du PSModulePath. Ce modèle de recherche permet d’installer plusieurs versions du même module dans différents dossiers. Par exemple :
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
Par défaut, PowerShell charge le numéro de version le plus élevé d’un module lorsque plusieurs versions sont trouvées. Pour charger une version spécifique, utilisez Import-Module
avec le paramètre FullyQualifiedName . Pour plus d’informations, voir Import-Module.
Modification de PSModulePath
Dans la plupart des cas, vous devez installer des modules dans les emplacements de module par défaut. Toutefois, vous devrez peut-être modifier la valeur de la variable d’environnement PSModulePath
.
Par exemple, pour ajouter temporairement le C:\Program Files\Fabrikam\Modules
répertoire à $env:PSModulePath
pour la session active, tapez :
$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"
Le point-virgule (;
) dans la commande sépare le nouveau chemin du chemin qui le précède dans la liste. Sur les plateformes non-Windows, le signe deux-points (:
) sépare les emplacements de chemin d’accès dans la variable d’environnement.
Modification de PSModulePath dans non-Windows
Pour modifier la valeur de PSModulePath
pour chaque session dans un environnement non-Windows, ajoutez la commande précédente à votre profil PowerShell.
Modification de PSModulePath dans Windows
Pour modifier la valeur de PSModulePath
dans chaque session, modifiez la clé de Registre qui stocke les PSModulePath
valeurs. Les PSModulePath
valeurs sont stockées dans le Registre sous forme de chaînes non expirées . Pour éviter d’enregistrer définitivement les PSModulePath
valeurs en tant que chaînes développées , utilisez la méthode GetValue sur la sous-clé et modifiez directement la valeur.
L’exemple suivant ajoute le C:\Program Files\Fabrikam\Modules
chemin d’accès à la valeur de la PSModulePath
variable d’environnement sans développer les chaînes non développées.
$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)
Pour ajouter un chemin d’accès au paramètre utilisateur, remplacez le fournisseur de Registre par HKLM:\
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)