2013-09-30 8 views
6

Ich habe ein Skript, das ich interaktiv von der PowerShell-Eingabeaufforderung verwenden möchte. Das Skript muss ein lokales Skriptmodul verwenden.Wie kann ich ein PowerShell-Modul in einem Skript verwenden, ohne das Modul in der Benutzersitzung zu belassen?

Ich kann nicht sehen, wie das Modul zu importieren/verwenden, so dass es nicht in der aktuellen Sitzung geladen bleibt.

Beispiel

A-Modul (mymodule.psm1) ...

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

... und ein Skript (script.ps1)

Import-Module .\MyModule 
Test-Method 

nun das Skript ausgeführt an der PowerShell-Eingabeaufforderung ...

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 

Wie kann mein Skript MyModule.psm1 importieren und verwenden, ohne dass es in der aktuellen Sitzung des Aufrufers geladen wird? Bedenkt man, dass der Aufruf das Modul bereits importiert hat und nicht möchte, dass es vom Skript entladen wird (das Entfernen des Moduls nach Abschluss des Skripts ist also nicht wirklich gut genug).

Ich habe als Dot-Sourcing das Modul, anstatt zu importieren, aber ich mag das Modul für die in PowerShell Import-Module vs Dot Sourcing

Antwort

1

bedeckt Gründen Soweit ich das beurteilen kann, bekommt man nicht, dass die automatische Bereinigung Verhalten von ein "Skript", das ein Modul importiert. OTOH Wenn Sie ein Modul aus einem anderen Modul importieren und das übergeordnete Modul entfernt wird, werden alle importierten Module entfernt, wenn keine anderen Module sie verwenden (oder wenn ipmo -global nicht angegeben wurde).

+0

Das ist mehr oder weniger wo ich hin musste. Für mich ist es nicht gut, PowerShell als (traditionelle) Shell zu benutzen - soweit ich sicher war, dass mir etwas fehlte. –

+0

Wofür steht "ipmo"? Das habe ich noch nie gesehen und Google hilft nicht zu viel. – jpmc26

+1

@ jpmc26 'ipmo' ist ein Alias ​​für' Import-Module'. –

6

Es klingt wie Sie bereits in Pseudo-Code beschrieben, was Sie wollten. Hier ist es in der tatsächlichen Code:

$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

Ja, guter Punkt. Aus irgendeinem Grund fühlte sich das nicht ganz richtig an, obwohl ich keinen offensichtlichen Grund dafür erkennen kann. Ich hoffe, ich habe auf eine einfache Möglichkeit gehofft, dass der Import im eigenen Umfang des Skripts durchgeführt wird. –

+0

Ich denke, dass dies beide Kriterien erfüllt: Es scheint mir ziemlich einfach zu sein und kann sicherlich in einem Skript gemacht werden ... Was bietet Ihnen Ihre konzeptionell ideale Lösung sonst noch? –

-2

Sie das Modul mit -Scope local importieren kann ein Modul Ihres Skripts Umfang zu beschränken. Wenn das Modul auch im globalen Gültigkeitsbereich geladen wird, ist es nach dem Beenden des Skripts weiterhin verfügbar.

+0

Das funktionierte für mich mit einer Einschränkung: Nachdem das Skript beendet wurde, waren die im Modul deklarierten Funktionen nicht erreichbar (wie gewünscht), aber das Modul erschien immer noch, wenn Get-Module ausgeführt wurde. –

Verwandte Themen