Import-Module und der „-Prefix“ Parameter

Eine Sache die ich aus der Aufzeichnung der Präsentation „How to Position Yourself for the Future“ mit Jeffrey Snover und Jason Helmick (genauer, der Frage- und Antwortrunde bei 1:01:17) entnommen habe: man kann einen Präfix für die Befehle eines Moduls beim Import angeben!

In der Frage- und Antwortrunde erwähnt ein Teilnehmer, dass ein PowerShell Modul (vermutlich PowerCLI von VMWare) andere Befehle „überschreibt“, da Funktionen/Cmdlets in dem Modul gleich benannt sind wie Cmdlets von PowerShell Core oder anderen Modulen.

Importiert man das PowerCLI Modul wird einem der Befehl Get-VM zur Verfügung gestellt, was eine gute Idee ist, wenn man virtuelle Maschinen auf vSphere verwalten möchte, aber heutzutage kann es durchaus sein, dass man auch noch einen Hyper-V Server verwalten möchte, welches auch das Cmdlet Get-VM hat; und das vom gleichen Computer (z.B. mittels RSAT). Nach dem Import des Moduls ist es aber nicht länger möglich die virtuellen Maschinen des Hyper-V Servers zu verwalten (mindestens Get-VM funktioniert nicht mehr) ohne das PowerCLI Modul aus der PowerShell Instanz wieder zu entfernen (oder man spezifiziert genau, dass man jetzt diesen Befehl aus dem Hyper-V Modul verwenden möchte).

Es ist nicht sehr wahrscheinlich dass VMWare ihre Befehle zeitnah ändern wird, damit es nicht andere Cmdlets/Funktionen überschreibt/kollidiert. Was also tun, wenn man beide Hypervisoren in einem Skript verwalten möchte?

Man kann das Modul, das dafür sorgt, dass der Code nicht korrekt funktioniert mit dem Parameter -Prefix laden.

Schauen wir uns an wie das funktioniert. Zu Demo-Zwecken werde ich das BitsTransfer Modul verwenden.

Wenn man das Modul „wie gewohnt“ importiert und sich die verfügbaren Befehle anzeigen lässt bekommt man was man erwartet.

Aber importiert man das Modul mit einem Präfix wird dieser vor jedem einzelnen Befehl (nach dem Verb-) des Moduls eingefügt.

Ein sehr cooles Feature das ich bis jetzt noch nicht kannte.