2011-06-20 196 views
34

我正在学习PowerShell,并且正在尝试构建自己的模块库。Powershell导入模块找不到模块

我写了一个简单的模块XMLHelpers.psm1并放在我的文件夹$home/WindowsPowerShell/Modules

当我这样做:

import-module full_path_to_XMLHelpers.psm1 

它的工作原理。但是,当我做的:

import-module XMLHelpers 

它不工作,我得到的错误:

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

我检查了环境变量PSModulePath包含该文件夹。由于它是一个网络文件夹,我也试着将它移动到本地文件夹并修改PSModulePath但没有成功

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

什么可能导致此问题的任何想法?

+0

http://stackoverflow.com/q/14382579/299327看起来它是相关的。 –

回答

69

模块需要放置在与模块名称相同的文件夹中。你的情况:

$home/WindowsPowerShell/Modules/XMLHelpers/ 

的完整路径将是:

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

然后,您就能够做到:

import-module XMLHelpers 
+0

谢谢你的工作。我是否需要为每个模块遵循规则module_name/module_name.psm1? –

+0

@Serge:是的,每个单独的模块都是这样的。 –

+6

是的,除非您在'Import-Module'语句中使用完整路径。您还可以将函数组织成多个.psm1文件,并通过模块清单文件(.psd1)加载它们。在这种情况下,.psd1和多个.psm1文件将位于相同的“module_name /”目录下。只有.psd1文件需要与模块具有相同的名称。 – Rynant

7

我认为Import-Module试图找到该模块在默认目录C:\Windows\System32\WindowsPowerShell\v1.0\Modules

尝试把完整路径,或将其复制到C:\Windows\System32\WindowsPowerShell\v1.0\Modules

+3

这只是它看起来的一个位置。还有其他人。参见'$ env:PSModulePath'。 – jpmc26

4

我经历了同样的错误,并试图许多事情我成功了。解决的办法是脚本的路径,预先准备这样的模块的相对路径:在http://msdn.microsoft.com/en-us/library/dd878284(v=vs.85).aspx

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

Import-Module $ScriptPath\Modules\Builder.psm1 

顺便说一句,你应该看一看其中规定:

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

这只有在“模块”目录与脚本位于相同位置时才有效。 – jpmc26

4

1,本会搜索XMLHelpers/XMLHelpers.psm1当前文件夹中

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

2.本将当前文件夹

在搜索XMLHelpers.psm
Import-Module (Resolve-Path('XMLHelpers.psm1')) 
1

某些插件需要一个作为Administrator运行,并且不会加载,除非在shell中有活动的凭据。

0

我在Windows 7上使用PS 5.0的发现:$ENV:PsModulePath必须以a结尾。这通常意味着它将加载该路径中的所有模块。

我无法将单个模块添加到$ env:PsModulePath并使用Import-Module ExampleModule加载它。我必须使用模块的完整路径。例如C:\MyModules\ExampleModule。我相信它曾经工作。

例如: 说我有模块:

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

我需要添加C:\MyModules\$env:PsModulePath,这将让我做

Import-Module ExampleModule 
Import-Module FishingModule 

如果由于某种原因,我没有” t想要FishingModule,我以为我可以只加C:\MyModules\ExampleModule(没有拖尾\),但现在看起来不起作用。加载它,我必须Import-Module C:\MyModules\ExampleModule

有趣的是,在这两种情况下,做Get-Module -ListAvailable,显示模块,但它不会导入。虽然,模块的cmdlet似乎无论如何工作。为了使自动导入工作,必须在函数清单(.psd1)文件的FunctionsToExport中添加该函数的名称。添加FunctionsToExport = '*',打破自动加载。模块文件(.psm1)中仍可以有Export-ModuleMember -Function *

这些是我的发现。是否有变化或我的电脑坏了,还有待观察。 HTH

1

我有这个问题,但只在Visual Studio代码中,而不是在ISE中。原来我在VSCode中使用x86会话。我显示了PowerShell会话菜单并切换到x64会话,所有模块都开始工作,没有完整路径。我正在使用版本1.17.2,VSCode的架构x64。我的模块存储在C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules目录中。