2011-06-20 13 views
34

Uczę się programu PowerShell i próbuję zbudować własną bibliotekę modułów.Moduł importu Powershell nie znajduje modułów

Napisałem prosty moduł XMLHelpers.psm1 i umieściłem w moim folderze $home/WindowsPowerShell/Modules.

Kiedy zrobić:

import-module full_path_to_XMLHelpers.psm1 

To działa. Ale kiedy zrobić:

import-module XMLHelpers 

To nie działa i pojawia się błąd:

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

Sprawdziłem, że zmienna środowiskowa PSModulePath zawiera ten katalog. Ponieważ jest to folder sieciowy, ja również starał się przenieść go do folderu lokalnego i modyfikować PSModulePath ale bez powodzenia

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

Każdy pomysł na to, co może być przyczyną tego problemu?

+0

http://stackoverflow.com/q/14382579/299327 wydaje się być powiązany. –

Odpowiedz

69

Moduł musi być umieszczony w folderze o takiej samej nazwie jak moduł. W twoim przypadku:

$home/WindowsPowerShell/Modules/XMLHelpers/ 

Pełna ścieżka będzie:

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

Można by następnie móc to zrobić:

import-module XMLHelpers 
+0

Dzięki to działa. Czy potrzebuję, aby każdy moduł działał zgodnie z regułą nazwa_modułu/nazwa_modułu.psm1? –

+0

@Serge: Tak, każdy oddzielny moduł jest właśnie taki. –

+6

Tak, chyba że używasz pełnej ścieżki w instrukcji 'Import-Module'. Można również organizować funkcje w wielu plikach .psm1 i ładować je za pomocą pliku manifestu modułu (.psd1). W tym przypadku pliki .psd1 i multiple .psm1 będą znajdować się w tym samym katalogu "nazwa_modułu /". Tylko plik .psd1 musiałby mieć taką samą nazwę jak moduł. – Rynant

7

myślę że Import-Module próbuje znaleźć moduł w domyślnym katalogu C:\Windows\System32\WindowsPowerShell\v1.0\Modules.

Spróbuj umieścić pełną ścieżkę, lub skopiuj go do C:\Windows\System32\WindowsPowerShell\v1.0\Modules

+3

To tylko jedna lokalizacja, na którą wygląda. Są inni. Zobacz '$ env: PSModulePath'. – jpmc26

4

przeżyłem ten sam błąd i próbował wielu rzeczy, zanim udało mi się. Rozwiązaniem było poprzedzić ścieżkę skryptu do względnej ścieżki modułu jak ten:

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

Import-Module $ScriptPath\Modules\Builder.psm1 

Btw należy przyjrzeć http://msdn.microsoft.com/en-us/library/dd878284(v=vs.85).aspx który stanowi:

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

Działa to tylko wtedy, gdy katalog 'Modules' znajduje się w tym samym miejscu co skrypt. – jpmc26

4

1.This wyszuka XMLHelpers/XMLHelpers.psm1 w bieżącym folderze

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

2.Niniejsze wyszuka XMLHelpers.psm1 w bieżącym folderze

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

Niektóre wtyczki wymagają jednej do uruchomienia jako Administrator i nie zostaną załadowane, chyba że te dane są aktywne w powłoce.

0

Moje odkrycie w systemie PS 5.0 w systemie Windows 7: $ENV:PsModulePath musi zakończyć się znakiem. Zwykle oznacza to, że załaduje wszystkie moduły na tej ścieżce.

Nie mogę dodać pojedynczego modułu do $ env: PsModulePath i załadować go do Import-Module ExampleModule. Muszę użyć pełnej ścieżki do modułu. na przykładC:\MyModules\ExampleModule. Jestem pewien, że kiedyś działało.

Na przykład: że mam moduły:

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

muszę dodawać C:\MyModules\ do $env:PsModulePath, który pozwoli mi zrobić

Import-Module ExampleModule 
Import-Module FishingModule 

Jeśli z jakiegoś powodu nie zrobił” t want FishingModule, Myślałem, że mogę dodać tylko C:\MyModules\ExampleModule (bez końcowych \), ale teraz to nie działa. Aby go wczytać, muszę do Import-Module C:\MyModules\ExampleModule

Co ciekawe, w obu przypadkach, wyświetlanie Get-Module -ListAvailable, pokazuje moduły, ale nie będzie importować. Chociaż polecenia cmdlet modułu działają mimo to.

AFAIK, aby automatyczny import działał, należy dodać nazwę funkcji do FunctionsToExport w pliku manifestu (.psd1). Dodanie FunctionsToExport = '*', powoduje przerwanie automatycznego ładowania. Nadal możesz mieć Export-ModuleMember -Function * w pliku modułu (.psm1).

Oto moje wyniki. Niezależnie od tego, czy nastąpiła zmiana, czy mój komputer jest uszkodzony, pozostaje jeszcze do zobaczenia. HTH

1

Miałem ten problem, ale tylko w Visual Studio Code, a nie w ISE. Okazuje się, że używałem sesji x86 w VSCode. Wyświetliłem menu sesji PowerShell i przełączyłem się na sesję x64, a wszystkie moduły zaczęły działać bez pełnych ścieżek. Używam wersji 1.17.2, architektury x64 VSCode. Moje moduły były przechowywane w katalogu C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules: .

Powiązane problemy