J'apprends PowerShell et j'essaie de créer ma propre bibliothèque de modules.
J'ai écrit un module simple XMLHelpers.psm1
et mis dans mon dossier $home/WindowsPowerShell/Modules
.
Quand je fais:
import-module full_path_to_XMLHelpers.psm1
Ça marche. Mais quand je fais:
import-module XMLHelpers
Cela ne fonctionne pas et j'obtiens l'erreur:
Import-Module: Le module spécifié 'xmlhelpers' n'a pas été chargé car aucun fichier de module valide n'a été trouvé dans un répertoire de module.
J'ai vérifié que la variable d'environnement PSModulePath
contient ce dossier. S'agissant d'un dossier réseau, j'ai également essayé de le déplacer dans un dossier local et de modifier PSModulePath
mais sans succès.
$env:PSModulePath=$env:PSModulePath+";"+'C:\local'
Une idée sur ce qui pourrait causer ce problème?
Le module doit être placé dans un dossier portant le même nom que le module. Dans ton cas:
$home/WindowsPowerShell/Modules/XMLHelpers/
Le chemin complet serait:
$home/WindowsPowerShell/Modules/XMLHelpers/XMLHelpers.psm1
Vous seriez alors capable de faire:
import-module XMLHelpers
Je pense que le Import-Module
essaie de trouver le module dans le répertoire par défaut C:\Windows\System32\WindowsPowerShell\v1.0\Modules
.
Essayez de mettre le chemin complet ou copiez-le dans C:\Windows\System32\WindowsPowerShell\v1.0\Modules
1.Ceci recherchera XMLHelpers/XMLHelpers.psm1 dans le dossier actuel
Import-Module (Resolve-Path('XMLHelpers'))
2.Ceci recherchera XMLHelpers.psm1 dans le dossier en cours
Import-Module (Resolve-Path('XMLHelpers.psm1'))
J'ai vécu la même erreur et essayé de nombreuses choses avant de réussir. La solution consistait à ajouter le chemin du script au chemin relatif du module, comme suit:
// Note that .Path will only be available during script-execution
$ScriptPath = Split-Path $MyInvocation.MyCommand.Path
Import-Module $ScriptPath\Modules\Builder.psm1
Btw, vous devriez jeter un oeil à http://msdn.Microsoft.com/en-us/library/dd878284(v=vs.85).aspx qui indique:
À compter de Windows PowerShell 3.0, les modules sont importés automatiquement lorsqu'une cmdlet ou une fonction du module est utilisée dans une commande. Cette fonctionnalité fonctionne sur tous les modules d'un répertoire inclus dans la valeur de la variable d'environnement PSModulePath ($ env: PSModulePath).
J'ai eu ce problème, mais uniquement dans Visual Studio Code, pas dans ISE. Il s'avère que j'utilisais une session x86 en VSCode. J'ai affiché le menu de session PowerShell et je suis passé à la session x64, et tous les modules ont commencé à fonctionner sans chemins complets. J'utilise la version 1.17.2, architecture x64 de VSCode. Mes modules étaient stockés dans le répertoire C:\Windows\System32\WindowsPowerShell\v1.0\Modules .
Certains plugins nécessitent que l'un d'eux s'exécute en tant que Administrator
et ne se chargera que si l'un de ces identifiants est actif dans le shell.
Ma conclusion avec PS 5.0 sur Windows 7: $ENV:PsModulePath
doit se terminer par un. Cela signifie normalement que tous les modules seront chargés dans ce chemin.
Je ne parviens pas à ajouter un seul module à $ env: PsModulePath et à le charger avec Import-Module ExampleModule
. Je dois utiliser le chemin complet du module. par exemple. C:\MyModules\ExampleModule
. Je suis sûr que cela fonctionnait.
Par exemple: Disons que j'ai les modules:
C:\MyModules\ExampleModule
C:\MyModules\FishingModule
Je dois ajouter C:\MyModules\
à $env:PsModulePath
, ce qui me permettra de faire
Import-Module ExampleModule
Import-Module FishingModule
Si pour une raison quelconque, je ne voulais pas FishingModule
, je pensais pouvoir ajouter C:\MyModules\ExampleModule
seulement (pas de fin \), mais cela ne semble pas fonctionner maintenant. Pour le charger, je dois Import-Module C:\MyModules\ExampleModule
Fait intéressant, dans les deux cas, Get-Module -ListAvailable
affiche les modules, mais cela n’importera pas. Bien que, les applets de commande du module semblent fonctionner de toute façon.
Si je comprends bien, pour que l'importation automatique fonctionne, il faut ajouter le nom de la fonction à FunctionsToExport dans le fichier manifeste (.psd1). L'ajout de FunctionsToExport = '*'
interrompt le chargement automatique. Vous pouvez toujours avoir Export-ModuleMember -Function *
dans le fichier de module (.psm1).
Ce sont mes conclusions. Qu'il y ait eu un changement ou que mon ordinateur soit en panne, reste à voir. HTH