2013-09-30 3 views
6

Ho uno script che desidero utilizzare in modo interattivo dal prompt di PowerShell. Lo script deve utilizzare un modulo di script locale.Come posso utilizzare un modulo PowerShell in uno script senza lasciare il modulo caricato nella sessione dell'utente?

Non riesco a vedere come importare/utilizzare il modulo in modo che non venga caricato nella sessione corrente.

Esempio

un modulo (MyModule.psm1) ...

function Test-Method 
{ 
    write-host "Test-Method invoked" 
} 

... e uno script (script.ps1)

Import-Module .\MyModule 
Test-Method 

Ora l'esecuzione dello script al prompt di PowerShell ...

PS C:\temp> Get-Module | % {$_.Name} 
Microsoft.PowerShell.Management 
Microsoft.PowerShell.Utility 

PS C:\temp> .\script.ps1 
Test-Method invoked 

PS C:\temp> Get-Module | % {$_.Name} 
Microsoft.PowerShell.Management 
Microsoft.PowerShell.Utility 
MyModule 

Come può il mio script importare e utilizzare MyModule.psm1 senza che venga lasciato caricato nella sessione corrente del chiamante? Tenendo presente che la chiamata potrebbe aver già importato il modulo e non vorrebbe che fosse scaricato dallo script (quindi la semplice rimozione del modulo al completamento dello script non è veramente buona).

Ho considerato dot-sourcing il modulo piuttosto che importarlo, ma voglio il modulo per i motivi coperti in PowerShell Import-Module vs Dot Sourcing

risposta

1

Per quanto posso dire, non si ottiene che il comportamento di pulizia automatica da uno "script" che importa un modulo. OTOH se si importa un modulo da un altro modulo, quando il modulo genitore viene rimosso, tutti i moduli che ha importato verranno rimossi se non ci sono altri moduli che li usano (oa meno che ipmo-global sia stato specificato).

+0

Questo è più o meno dove avrei dovuto. Per me non si adatta affatto bene all'uso di PowerShell come shell (tradizionale) - nella misura in cui ero sicuro che mi mancasse qualcosa. –

+0

Cosa significa "ipmo"? Non l'ho mai visto e Google non sta aiutando troppo. – jpmc26

+1

@ jpmc26 'ipmo' è un alias per' Import-Module'. –

6

Sembra che tu abbia già descritto in pseudo-codice cosa volevi. Qui è in codice vero e proprio:

$checkCmds = Get-Commands -Module MyModule 

Import-Module MyModule 

# Do stuff here . . . 

# unload only if we loaded it 
if ($checkCmds -eq $null) { Remove-Module MyModule } 
+0

Sì, buon punto. Per qualche ragione, questo non mi sembrava giusto, anche se non vedo alcun motivo ovvio per cui no. Suppongo che speravo in qualche modo diretto per l'importazione da fare nello scope dello script stesso. –

+0

Penso che questo soddisfi entrambi i criteri: mi sembra abbastanza semplice e può certamente essere fatto all'interno di una sceneggiatura ... quindi che altro potrebbe offrire la vostra soluzione concettualmente ideale? –

-2

è possibile importare il modulo con -Scope local per limitare un modulo per la portata del vostro script. Se il modulo viene caricato anche nello scope globale, sarà comunque disponibile dopo lo script.

+0

Questo ha funzionato per me con un avvertimento: dopo che lo script è terminato, le funzioni dichiarate nel modulo non erano accessibili (come desiderato), tuttavia il modulo è ancora apparso durante l'esecuzione di Get-Module. –