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.

Import-Module ohne Prefix

Import-Module ohne Prefix

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

Import-Module mit Prefix

Import-Module mit Prefix

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