2015-02-26 30 views
32

Aby sprawdzić, czy moduł istnieje Próbowałem następujące:Jak sprawdzić, czy moduł powershell jest zainstalowany?

try { 
    Import-Module SomeModule 
    Write-Host "Module exists" 
} catch { 
    Write-Host "Module does not exist" 
} 

Wyjście jest:

Import-Module : The specified module 'SomeModule' was not loaded because no valid module file was found in any module directory. 
At D:\keytalk\Software\Client\TestProjects\Export\test.ps1:2 char:5 
+  Import-Module SomeModule 
+  ~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ResourceUnavailable: (SomeModule:String) [Import-Module], FileNotFoundException 
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand 

Module exists 

zrobić pojawia się błąd, ale nie jest wyjątek, więc widzimy Module exists w koniec, chociaż SomeModule nie istnieje.

Czy ktoś zna dobrą metodę (najlepiej bez generowania błędu), aby wykryć, czy moduł powershell jest zainstalowany w systemie?

+0

Zobacz [Wskazówka: Wyświetl załadowane i dostępne moduły w Windows PowerShell] (https://technet.microsoft.com/en-us/library/ff642467.aspx) –

Odpowiedz

56

Znaleziono rozwiązanie. Można użyć opcji ListAvailable z Get-Module:

if (Get-Module -ListAvailable -Name SomeModule) { 
    Write-Host "Module exists" 
} else { 
    Write-Host "Module does not exist" 
} 
+1

Miałem zamiar zasugerować: Moduł importu NonexModule -ErrorAction SilentlyContinue IF (błąd $) Moduł {Write-Host 'nie istnieje'} ELSE Moduł {Write-Host istnieje}} Ale twoja droga jest lepszy, bardziej elegancki :) –

+0

Działa to świetnie. Dzięki. Użyję modułu "Write-Warning", który nie istnieje ... "Break" Ale wykonałeś całą ciężką pracę. –

13

Opcja ListAvailable nie działa dla mnie. Zamiast tego robi:

if (-not (Get-Module -Name "<moduleNameHere>")) { 
    # module is not loaded 
} 

Albo, żeby być bardziej zwięzły:

if (!(Get-Module "<moduleNameHere>")) { 
    # module is not loaded 
} 
+4

Co jest nie tak podczas używania '-ListAvailable'? –

+0

@ oɔɯǝɹ Pomyślałem -ListDostępny był po prostu niedostępny, ale wciąż próbowałem Import-Module. Z Get-Module jest w porządku –

+0

Sprawdzasz, czy moduł LOADED (który jest przydatny sam w sobie -http: //www.systemcentercentral.com/powershell-tip-how-to-load-if-a-module-is-loaded-before -attempting-import-module-3 /), ale nie druga odpowiedź sprawdza, czy moduł istnieje. –

4

Wystarczy revisiting to jako jego somthing po prostu do czynienia i jest trochę niepoprawne rzeczy w odpowiedziach (choć jego wspomniano w komentarzach).

Po pierwsze, oryginalne pytania zadają pytanie, czy można określić, czy moduł Powershell jest zainstalowany. Musimy mówić o zainstalowanym słowie! Nie instalujesz modułów Powershell (nie w tradycyjny sposób instalujesz oprogramowanie). Moduły Powershell są dostępne (tj. Znajdują się na ścieżce modułu powershell) lub są importowane (są importowane do sesji użytkownika i można wywoływać funkcje zawarte w nim). Jest to, jak sprawdzić ścieżkę modułu, w przypadku, gdy chcesz wiedzieć, gdzie przechowywać moduł:

$env:psmodulepath 

bym twierdzą, że jej coraz powszechne w użyciu C: Program Files \ \ \ WindowsPowerShell modułów; częściej ze względu na to, że jest dostępny dla wszystkich użytkowników, ale jeśli chcesz zablokować swoje moduły do ​​swojej sesji, dołącz je do swojego profilu. C: \ Users \% nazwa_użytkownika% \ Documents \ WindowsPowerShell \ Moduły;

W porządku, wróć do dwóch stanów.

Czy moduł jest dostępny (przy użyciu dostępnego do oznaczenia zainstalowanego w pytaniu oryginalnym)?

Get-Module -Listavailable -Name <modulename> 

To pokazuje, czy moduł jest dostępny do importu.

Czy moduł jest importowany? (użyłem tego jako odpowiedzi na słowo "istnieje" w pytaniu oryginalnym).

Get-module -Name <modulename> 

To będzie albo zwróci pusty ładunek nic, jeśli moduł nie jest importowany, albo opis jednej linii modułu, jeśli jest. Jak zawsze w SO, wypróbuj powyższe komendy na własnych modułach.

Powiązane problemy