2015-02-26 1 views
32

Per verificare se un modulo esiste Ho provato quanto segue:Come posso verificare se un modulo PowerShell è installato?

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

L'output è:

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 

faccio un errore, ma non viene generata un'eccezione, così vediamo Module exists nel fine, anche se SomeModule non esiste.

Qualcuno conosce un modo buono (preferibilmente senza generare un errore) per rilevare se un modulo PowerShell è installato nel sistema?

+0

Vedere [Suggerimento: visualizzare i moduli caricati e disponibili in Windows PowerShell] (https://technet.microsoft.com/en-us/library/ff642467.aspx) –

risposta

56

Trovato una soluzione. È possibile utilizzare l'opzione ListAvailable di Get-Module:

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

stavo per suggets: Import-Module NonexistingModule -ErrorAction SilentlyContinue IF ($ error) {Write-Host 'modulo non esiste'} else {Write-Host 'Module esiste'} Ma la tua strada è meglio, più elegante :) –

+0

Funziona alla grande. Grazie. Userò "Write-Warning" Il modulo non esiste ... "Break" Ma hai fatto tutto il duro lavoro. –

13

L'opzione ListAvailable non funziona per me. Invece questo fa:

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

o, per essere più succinto:

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

Cosa non va quando usi '-ListAvailable'? –

+0

@ oɔɯǝɹ Pensavo che -ListAvailable semplicemente non fosse disponibile, ma stavo ancora provando con Import-Module. Con Get-Module va bene –

+0

Controlla se il modulo LOADED (che è utile da solo -http: //www.systemcentercentral.com/powershell-tip-how-to-load-if-a-module-is-loaded-before -ttempting-import-module-3 /), ma non l'altra risposta controlla se il modulo esiste. –

4

Proprio rivisitare questo come il suo somthing ho appena affrontato e non v'è un certo roba errato nelle risposte (anche se la sua menzionata nei commenti).

Per prima cosa, le domande originali chiedono come stabilire se è installato un modulo PowerShell. Dobbiamo parlare della parola installata! Non si installano i moduli Powershell (non nel modo tradizionale in cui si installa il software). I moduli PowerShell sono disponibili (ovvero si trovano sul percorso del modulo PowerShell) oppure vengono importati (vengono importati nella sessione e si possono richiamare le funzioni contenute). Questo è come controllare il vostro percorso del modulo, nel caso in cui si vuole sapere dove memorizzare un modulo:

$env:psmodulepath 

direi che la sua diventando comune l'uso di C: \ Program Files \ WindowsPowerShell \ moduli; più spesso perché è disponibile per tutti gli utenti, ma se vuoi bloccare i tuoi moduli nella tua sessione, includili nel tuo profilo. C: \ Users \% username% \ Documents \ WindowsPowerShell \ Modules;

OK, torna ai due stati.

Il modulo è disponibile (utilizzando disponibile per indicare installato nella domanda originale)?

Get-Module -Listavailable -Name <modulename> 

Questo indica se un modulo è disponibile per l'importazione.

Il modulo è importato? (Sto usando questa come la risposta per la parola "esiste" nella domanda originale).

Get-module -Name <modulename> 

Tutto questo può restituire un carico vuota nulla se il modulo non viene importato, o una descrizione di una linea del modulo se è. Come sempre su SO, prova i comandi precedenti sui tuoi moduli.