web-dev-qa-db-fra.com

Installation permanente du module PowerShell pour tous les utilisateurs

J'installe un module PowerShell via Octopus Deploy sur plusieurs serveurs différents. À des fins de test, je me suis inspiré de la documentation de Microsoft pour installer les modules PowerShell .

Cela a bien fonctionné, mais comme indiqué dans la documentation, mes modifications ne seraient visibles que pour la session en cours. C'est-à-dire si je devais faire ce qui suit:

$modulePath = [Environment]::GetEnvironmentVariable("PSModulePath", [EnvironmentVariableTarget]::Machine)
# More practically, this would be some logic to install only if not present
$modulePath += ";C:\CustomModules"
[Environment]::SetEnvironmentVariable("PSModulePath", $modulePath, [EnvironmentVariableTarget]::Machine)

Lors de l'exécution automatique de ce programme d'installation sur des serveurs tentacules, les sessions à venir de PowerShell ne semblent pas afficher les modules nouvellement installés.

Comment puis-je installer un module PowerShell de manière agnostique de profil afin que chaque session PowerShell démarrée puisse le voir?

9
Mike Bailey

PowerShell peut uniquement "voir" les modules installés dans l'un des répertoires répertoriés dans $env:PSModulePath. Sinon, vous devrez importer le module avec son chemin complet.

Pour rendre un nouveau module visible à tous les utilisateurs, vous avez essentiellement deux options:

  1. Installez le module dans le répertoire de modules par défaut du système (C:\Windows\system32\WindowsPowerShell\v1.0\Modules).
  2. Modifiez l’environnement système de sorte que la variable PSModulePath contienne déjà votre répertoire de module personnalisé (par exemple, via une préférence de stratégie group ).

Ce dernier ne deviendra effectif que pour les sessions PowerShell démarrées après la modification.

10
Ansgar Wiechers

Ce profil s'applique à tous les utilisateurs et à tous les shells. 

%windir%\system32\WindowsPowerShell\v1.0\profile.ps1
1
Knuckle-Dragger

Après avoir suivi les étapes que vous avez expliquées dans votre question (ce qui, à mon avis, est la voie à suivre), j'ai trouvé deux moyens de faire reconnaître le nouveau code source du module par Powershell:

  • Redémarrez la machine. (Fonctionne à chaque fois.)
  • Réinitialisez la PSModulePath dans chaque session ouverte.

    $env:PSModulePath=[Environment]::GetEnvironmentVariable("PSModulePath", "Machine")
    

    J'ai trouvé qu'il était nécessaire de s'exécuter à la fois dans les invites normales et élevées pour que cela fonctionne sans redémarrer dans chaque type d'invite. (Voir aussi la conversation @ Sujet: PSModulePath .)

0
Peter Majeed