2011-06-20 25 views
34

Estoy aprendiendo PowerShell y estoy tratando de construir mi propia biblioteca de módulos.Powershell import-module no encuentra los módulos

He escrito un módulo simple XMLHelpers.psm1 y lo puse en mi carpeta $home/WindowsPowerShell/Modules.

Cuando hago:

import-module full_path_to_XMLHelpers.psm1 

Funciona. Pero cuando lo haga:

import-module XMLHelpers 

no funciona y me sale el error:

Import-Module : The specified module 'xmlhelpers' was not loaded because no valid module file was found in any module directory.

He comprobado que la variable de entorno PSModulePath contiene esta carpeta. Como se trata de una carpeta de red, también he intentado mover a una carpeta local y para modificar PSModulePath pero sin éxito

$env:PSModulePath=$env:PSModulePath+";"+'C:\local' 

Cualquier idea sobre lo que podría causar este problema?

+0

http://stackoverflow.com/q/14382579/299327 parece estar relacionado. –

Respuesta

69

El módulo debe colocarse en una carpeta con el mismo nombre que el módulo. En su caso:

$home/WindowsPowerShell/Modules/XMLHelpers/ 

La ruta completa sería:

$home/WindowsPowerShell/Modules/XMLHelpers/XMLHelpers.psm1 

A continuación, sería capaz de hacer:

import-module XMLHelpers 
+0

Gracias, funciona. ¿Necesito que cada módulo siga la regla module_name/module_name.psm1? –

+0

@Serge: Sí, cada módulo por separado es así. –

+6

Sí, a menos que utilice la ruta completa en la instrucción 'Import-Module'. También puede organizar funciones en múltiples archivos .psm1 y cargarlos mediante un archivo de Manifiesto de módulo (.psd1). En este caso, los archivos .psd1 y múltiples .psm1 se ubicarían bajo el mismo directorio "module_name /". Solo el archivo .psd1 necesitaría tener el mismo nombre que el módulo. – Rynant

7

Creo que el Import-Module está tratando de encontrar el módulo en el directorio predeterminado C:\Windows\System32\WindowsPowerShell\v1.0\Modules.

tratar de poner la ruta completa, o copiarlo a C:\Windows\System32\WindowsPowerShell\v1.0\Modules

+3

Esa es solo una ubicación que parece. Hay otros. Ver '$ env: PSModulePath'. – jpmc26

4

he experimentado el mismo error y trató muchas cosas antes de lo logré. La solución consistió en anteponer la ruta del script a la ruta relativa del módulo de la siguiente manera:

// Note that .Path will only be available during script-execution 
$ScriptPath = Split-Path $MyInvocation.MyCommand.Path 

Import-Module $ScriptPath\Modules\Builder.psm1 

Por cierto que debería echar un vistazo a http://msdn.microsoft.com/en-us/library/dd878284(v=vs.85).aspx que establece:

Beginning in Windows PowerShell 3.0, modules are imported automatically when any cmdlet or function in the module is used in a command. This feature works on any module in a directory that this included in the value of the PSModulePath environment variable ($env:PSModulePath)

+0

Esto solo funcionaría si el directorio 'Módulos' está en la misma ubicación que el script. – jpmc26

4

1. Este buscará XMLHelpers/XMLHelpers.psm1 de la carpeta actual

Import-Module (Resolve-Path('XMLHelpers')) 

2. Este buscarán XMLHelpers.psm1 en la carpeta actual

Import-Module (Resolve-Path('XMLHelpers.psm1')) 
1

Algunos complementos requieren uno para ejecutarse como Administrator y no se cargarán a menos que uno tenga esas credenciales activas en el shell.

0

Mi hallazgo con PS 5.0 en Windows 7: $ENV:PsModulePath tiene que terminar con a. Esto normalmente significa que cargará todos los módulos en esa ruta.

No puedo agregar un solo módulo a $ env: PsModulePath y puedo cargarlo con Import-Module ExampleModule. Tengo que usar la ruta completa al módulo. p.ej.C:\MyModules\ExampleModule. Estoy seguro de que solía funcionar.

Por ejemplo: Decir que tengo los módulos:

C:\MyModules\ExampleModule 
C:\MyModules\FishingModule 

tengo que añadir C:\MyModules\ a $env:PsModulePath, lo que permitirá que haga

Import-Module ExampleModule 
Import-Module FishingModule 

Si por alguna razón, yo no' Quiero FishingModule, pensé que podría agregar C:\MyModules\ExampleModule solamente (sin seguimiento \), pero parece que esto no funciona ahora. Para cargarlo, tengo que Import-Module C:\MyModules\ExampleModule

Curiosamente, en ambos casos, haciendo Get-Module -ListAvailable, muestra los módulos, pero no se importará. Aunque, los cmdlets del módulo parecen funcionar de todos modos.

AFAIK, para obtener la importación automática al trabajo, uno tiene que agregar el nombre de la función a FunctionsToExport en el archivo de manifiesto (.psd1). Al agregar FunctionsToExport = '*', se rompe la carga automática. Aún puede tener Export-ModuleMember -Function * en el archivo del módulo (.psm1).

Estos son mis resultados. Ya sea que haya habido un cambio o mi computadora está rota, aún está por verse. HTH

1

Tuve este problema, pero solo en Visual Studio Code, no en ISE. Resulta que estaba usando una sesión x86 en VSCode. Mostré el menú de sesión de PowerShell y cambié a la sesión x64, y todos los módulos comenzaron a funcionar sin rutas completas. Estoy usando la versión 1.17.2, arquitectura x64 de VSCode. Mis módulos se almacenaron en el directorio C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules.