2011-06-20 240 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目錄中。