2010-08-26 11 views
3

Je joue un peu avec les capacités dynamiques de Powershell et je me demandais quelque choseEst-ce que powershell a un method_missing()?

Est-il quelque chose dans powershell analogue à la method_missing de Ruby() où vous pouvez mettre en place un « fourre-tout méthode » pour gérer dynamiquement les appels vers méthodes inexistantes sur vos objets?

Répondre

2

Non, pas vraiment. Je soupçonne que la prochaine version de PowerShell sera plus en ligne avec les capacités de répartition dynamique ajoutées à .NET 4 mais pour le moment, cela ne serait pas possible dans PowerShell pur.

Bien que je me rappelle qu'il existe un modèle de composant similaire à celui trouvé dans TypeDescriptor .NET pour créer des objets qui fournissent dynamiquement des propriétés et des méthodes à PowerShell. C'est ainsi que les éléments XML peuvent être traités comme des objets, par exemple. Mais ceci est peu documenté, et dans mon expérience, beaucoup de types/méthodes nécessaires pour s'intégrer sont marqués comme internes.

+0

+1 C'est le littéral [xml] qui m'a fait penser que cela doit être possible – Willbill

1

Vous pouvez l'émuler, mais c'est difficile. La technique est décrite dans le livre de Lee Holmes et est réduite à deux scripts - Add-RelativePathCapture http://poshcode.org/2131 et New-CommandWrapper http://poshcode.org/2197.

L'essentiel est - vous pouvez remplacer toute cmdlet via New-CommandWrapper. Ainsi, vous pouvez redéfinir Out-Default implicitement appelé à la fin de presque toutes les commandes (à l'exception des commandes avec des formateurs explicites comme Format-Table à la fin). Dans la nouvelle Out-Default, vous vérifiez si la dernière commande a émis une exception indiquant qu'aucune méthode/propriété n'a été trouvée. Et là vous insérez votre logique method_missing.