Partager via


about_PSModulePath

Brève description

Cet article décrit l’objectif et l’utilisation de la variable d’environnement $Env:PSModulePath.

Description longue

La variable d’environnement $Env:PSModulePath contient une liste d’emplacements de dossiers. PowerShell recherche de manière récursive chaque dossier pour les fichiers de module (.psd1 ou .psm1).

Par défaut, les emplacements effectifs affectés à $Env:PSModulePath sont les suivants :

  • Modules installés dans l’étendue CurrentUser :
    • Sur Windows, ces modules sont stockés dans $HOME\Documents\PowerShell\Modules. L’emplacement spécifique du dossier Documents varie selon la version de Windows et lorsque vous utilisez la redirection de dossiers. En outre, Microsoft OneDrive peut modifier l’emplacement de votre dossier Documents. Pour vérifier l’emplacement de votre dossier Documents, exécutez la commande suivante : [Environment]::GetFolderPath('MyDocuments').
    • Sur les systèmes non Windows, ces modules sont stockés dans le dossier $HOME/.local/share/powershell/Modules.
  • Modules installés dans l’étendue AllUsers :
    • Sur Windows, ces modules sont stockés dans $Env:ProgramFiles\PowerShell\Modules.
    • Sur les systèmes non Windows, ces modules sont stockés dans /usr/local/share/powershell/Modules.
  • Les modules fournis avec PowerShell sont stockés dans $PSHOME\Modules.

Note

Les applications qui incluent des modules PowerShell peuvent installer des modules dans d’autres répertoires sur Windows, tels que le dossier Program Files. Le package d’installation peut ne pas ajouter l’emplacement au $Env:PSModulePath.

Les emplacements par défaut pour Windows PowerShell 5.1 sont différents de PowerShell 7.

  • Les modules installés dans l’étendue CurrentUser sont stockés dans $HOME\Documents\WindowsPowerShell\Modules.
  • Les modules installés dans l’étendue AllUsers sont stockés dans $Env:ProgramFiles\WindowsPowerShell\Modules.
  • Modules fournis avec Windows PowerShell stockés dans $PSHOME\Modules, qui est $Env:SystemRoot\System32\WindowsPowerShell\1.0\Modules.

Construction de 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 vous l’avez lancée.

Démarrage de Windows PowerShell

Windows PowerShell utilise la logique suivante pour construire le PSModulePath au démarrage :

  • Si PSModulePath n’existe pas, combinez currentUser, AllUserset les chemins des modules $PSHOME
  • Si PSModulePath existe :
    • Si PSModulePath contient $PSHOME chemin des modules :
      • chemin des modules AllUsers est inséré avant $PSHOME chemin des modules
    • autre:
      • Utilisez simplement PSModulePath comme défini, car l’utilisateur a délibérément supprimé l’emplacement $PSHOME

Le chemin du module CurrentUser est préfixé uniquement si l’étendue utilisateur $Env:PSModulePath n’existe pas. Sinon, l’étendue utilisateur $Env:PSModulePath est utilisée comme défini.

Démarrage de PowerShell 7

Dans Windows, pour la plupart des variables d’environnement, si la variable définie par l’utilisateur existe, un nouveau processus utilise cette valeur uniquement, même lorsqu’une variable délimitée par l’ordinateur du même nom existe. Le chemin d’accès variables d’environnement sont traités différemment.

Sur Windows, PSModulePath est traité comme la façon dont la variable d’environnement Path est traitée. Path est traitée différemment des autres variables d’environnement. Lorsqu’un processus est démarré, Windows combine l'Path délimitée par l’utilisateur avec l'Pathdélimitée par l’ordinateur.

  • Récupérer le PSModulePath délimité par l’utilisateur
  • Comparer au processus hérité PSModulePath variable d’environnement
    • Si la même chose est la même :
      • Ajoutez le AllUsersPSModulePath à la fin en suivant la sémantique de la variable d’environnement PATH
      • Le chemin d’accès windows System32 provient de l’ordinateur défini PSModulePath, il n’est donc pas nécessaire d’ajouter explicitement
    • Si elle est différente, traitez comme si l’utilisateur l’a modifié explicitement et n’ajoutez pas AllUsersPSModulePath
  • Préfixe avec les chemins d’accès utilisateur, système et $PSHOME PS7 dans cet ordre
    • Si powershell.config.json contient un PSModulePathdélimité par l’utilisateur, utilisez-le au lieu de la valeur par défaut pour l’utilisateur.
    • Si powershell.config.json contient un PSModulePathdélimité par le système, utilisez-le au lieu de la valeur par défaut pour le système

Les systèmes non-Windows 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 de 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 dans WinPSModulePath avec les modifications suivantes :

  • Supprimer PS7 le chemin du module utilisateur
  • Supprimer PS7 le chemin du module système
  • Supprimer PS7 le chemin du module $PSHOME

Les chemins PS7 sont supprimés afin que les modules PS7 ne soient pas chargés dans Windows PowerShell. La valeur WinPSModulePath est utilisée lors du démarrage de Windows PowerShell.

Démarrage de PowerShell 7 à partir de Windows PowerShell

Le démarrage de PowerShell 7 continue as-is avec l’ajout de chemins d’accès que Windows PowerShell a ajoutés. Étant donné que les chemins spécifiques à PS7 sont préfixés, il n’existe aucun problème fonctionnel.

Comportement de recherche de module

PowerShell recherche de manière récursive chaque dossier dans le PSModulePath pour les fichiers de module (.psd1 ou .psm1). Ce modèle de recherche permet à plusieurs versions du même module d’être installées 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, consultez 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 répertoire C:\Program Files\Fabrikam\Modules à $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 d’accès du chemin qui l’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 stockant les valeurs de PSModulePath. Les valeurs PSModulePath sont stockées dans le Registre sous forme de chaînes non expirées. Pour éviter d’enregistrer définitivement les valeurs PSModulePath en tant que chaînes étendues, utilisez la méthode GetValue() sur la sous-clé et modifiez la valeur directement.

L’exemple suivant ajoute le chemin d’accès C:\Program Files\Fabrikam\Modules à la valeur de la variable d’environnement PSModulePath sans développer les chaînes non expirées.

$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment')
$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, utilisez le code suivant :

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

Voir aussi