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.