Powershell : Conflits de noms de commandes

En me penchant récemment sur Hyper-V, j’ai pris conscience d’un problème qui semble pourtant évident : deux éditeurs peuvent très bien donner le même nom à une commande PowerShell qu’ils dévoloppent chacun de son côté.
Par exemple les commandes Get-VM, Start-VM ou Stop-VM existent aussi bien chez VMware que chez Microsoft.
Mais si les deux modules PowerShell sont présentes sur le même host, quelle sera la commande utilisée ?


Chargeons le module Hyper-V et le module principal VMware, puis affichons la liste des commandes Get-VM

> Import-Module Hyper-V
> Import-Module VMware.VimAutomation.Core
> Get-Command Get-VM

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-VM                                             6.5.0.2... VMware.VimAutomation.Core

Seule celle de VMware s’affiche, et c’est celle qui sera utilisée, car c’est le dernier module chargé.
Si on inverse l’ordre de chargement des modules, c’est celle de Hyper-V qui s’affiche.

> Import-Module VMware.VimAutomation.Core
> Import-Module Hyper-V
> Get-Command Get-VM

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-VM                                             2.0.0.0    Hyper-V

Il est cependant possible d’afficher les deux commandes, avec le paramètre -all. La première de la liste est celle utilisée par défaut.

> Get-Command Get-VM -all

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-VM                                             2.0.0.0    Hyper-V
Cmdlet          Get-VM                                             6.5.0.2... VMware.VimAutomation.Core

J’ai dit par défaut ?
Il est en effet possible de spécifier laquelle des deux commandes on veut utiliser en spécifiant le nom apparaissant dans la colonne Source sur les exemple ci dessus.

> Hyper-V\Get-VM
> VMware.VimAutomation.Core\Get-VM

Je le reconnais, ce n’est pas très pratique, surtout avec un nom de source à rallonge et lorsqu’il se répète dans la commande.

> VMware.VimAutomation.Core\Get-VM -Name "MaVM" | VMware.VimAutomation.Core\Start-VM

Ca devient vite lourd.
Heureusement, il est possible de préfixer la seconde partie du nom des commande lors de l’import du module (ce n’est cependant pas possible avec les Snapin).

> Import-Module VMware.VimAutomation.Core -Prefix VW_
> Import-Module Hyper-V -Prefix HV_
> Get-Command Get-???VM

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-HV_VM                                          2.0.0.0    Hyper-V
Cmdlet          Get-VW_VM                                          6.5.0.2... VMware.VimAutomation.Core
... 

On a maintenant deux commandes bien distinctes : Get-HV_VM pour Hyper-V et Get-VW_VM pour vSphere.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *