about_PSModulePath

La $env:PSModulePath variable d’environnement contient une liste d’emplacements de dossiers 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.

Par défaut, les emplacements effectifs auxquels sont affectés $env:PSModulePath sont les suivants :

  • Emplacements à l’échelle du système : ces dossiers contiennent des modules fournis avec PowerShell. Ces modules sont stocker dans le $PSHOME\Modules dossier . Il s’agit également de l’emplacement où les modules de gestion Windows sont installés.

  • Modules installés par l’utilisateur : il s’agit de modules installés par l’utilisateur. 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.

    • Sur Windows, l’emplacement de l’étendue CurrentUser spécifique à l’utilisateur est le $HOME\Documents\PowerShell\Modules dossier. L’emplacement de l’étendue AllUsers est $env:ProgramFiles\PowerShell\Modules.
    • Sur les systèmes non Windows, l’emplacement de l’étendue CurrentUser spécifique à l’utilisateur est le $HOME/.local/share/powershell/Modules dossier. L’emplacement de l’étendue AllUsers est /usr/local/share/powershell/Modules.

En outre, les programmes d’installation des modules dans d’autres répertoires, tels que le répertoire Program Files, peuvent ajouter leurs emplacements à la valeur de $env:PSModulePath.

Notes

Sur Windows, l’emplacement spécifique à l’utilisateur est le PowerShell\Modules dossier situé dans le dossier Documents de votre profil utilisateur. Le chemin d’accès spécifique de cet emplacement varie selon la version de Windows et si vous utilisez ou non la redirection de dossiers. Microsoft OneDrive peut également modifier l’emplacement de votre dossier Documents . Vous pouvez vérifier l’emplacement de votre dossier Documents à l’aide de la commande suivante : [Environment]::GetFolderPath('MyDocuments').

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
    • Autre:
      • PSModulePath Utilisez simplement comme défini puisque l’utilisateur a délibérément supprimé l’emplacement $PSHOME

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 si une variable d’étendue machine du même nom existe.

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 Pathmachine .

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

Les systèmes Unix n’ont pas de séparation entre les 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 dans avec WinPSModulePath les modifications suivantes :

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

Les chemins 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 continue en l’sorte 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 de 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 (;) de la commande sépare le nouveau chemin d’accès du chemin qui le précède dans la liste. Sur les plateformes autres que Windows, le signe deux-points (:) sépare les emplacements de chemin d’accès dans la variable d’environnement.

Modification de PSModulePath dans des 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 pour chaque session dans un environnement Windows, 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 développé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 la valeur directement.

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 += ';C:\Program Files\Fabrikam\Modules' # or '%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 += ';C:\Program Files\Fabrikam\Modules' # or '%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

Voir aussi