windows - powershell scripting
¿Podemos ver el código fuente de los cmdlets de PowerShell? (9)
Estoy aprendiendo algo de PowerShell. ¿Es posible ver el código fuente de un cmdlet integrado como Get-ChildItem ?
Creo que si acabaras de iniciar PowerShell, esto es lo que estarías buscando:
$metadata = New-Object system.management.automation.commandmetadata (Get-Command Get-Process)
[System.management.automation.proxycommand]::Create($MetaData) | out-file C:/powershell/get-process.ps1
Esto creará una secuencia de comandos que muestra cómo se ejecuta Get-Process . Coloque cualquier cmdlet que desee reemplazar Get-Process. Si desea buscar en Google más sobre esto, así es como crearía una función de proxy.
Debería poder utilizar .NET Reflector para "ver" el código fuente. Sin embargo, debe conocer el ensamblaje, pero también debe ser accesible utilizando el método GetType o similar.
Este complemento PowerShellLanguage .NET Reflector puede ser útil.
En realidad, su mejor opción es ir a las extensiones de la comunidad de PowerShell . Este proyecto de comunidad de software de código abierto está "destinado a proporcionar un conjunto de cmdlets adicionales ampliamente útil ...". Los desarrolladores del proyecto son los MVP de PowerShell y saben lo que hacen.
En cuanto al uso de la reflexión en los cmdlets de PowerShell existentes, PowerShell MVP Oisin Grehan realizó una práctica función titulada " Reflect-Cmdlet ". No robaré su código y lo colocaré aquí, pero básicamente lo que haces es:
Get-Command Get-ChildItem | Reflect-Cmdlet
Y luego .NET Reflector aparece con el ensamblaje correcto abierto y expandido y todo. Es realmente genial. Aquí hay una captura de pantalla:
Texto alternativo http://halr9000.com/images/screenshots/reflector.png
Los ensamblados de cmdlets de PowerShell se encuentran en GAC. Puede encontrar el cmdlet "Get-ChildItem" en:
Ensamblado Microsoft.PowerShell.Commands.Management, clase Microsoft.PowerShell.Commands.GetChildItemCommand .
Utilicé el decompilador .NET de ILSpy y los ensamblajes GAC filtrados mediante cadenas "powershell". Según tengo entendido, los ensamblados de Microsoft.PowerShell.Commands. * Contienen cmdlets integrados.
No creo que el código fuente de PowerShell haya sido lanzado alguna vez.
Para los cmdlets compilados, puede obtener la ruta al .dll
con:
(Get-Command Get-ChildItem).DLL
(Reemplace Get-ChildItem
con el cmdlet en el que está interesado)
Una vez que conozca la ruta al dotPeek .dll
, puede abrirlo con un desensamblador .NET como dotPeek :
& dotPeek64.exe (Get-Command Get-ChildItem).DLL
Se puede encontrar algún código en el sitio de recursos de referencia: http://referencesource.microsoft.com/#System.Management.Automation/System/Management/Automation/ChildItemCmdletProviderIntrinsics.cs,c6eed9f6a5417c19
Esto solo da el esquema; no el detalle del código
También podría echarle un vistazo al complemento de Windows Installer PowerShell en CodePlex. Es un proyecto más pequeño que las extensiones de la comunidad, por lo que es más fácil entender lo que está sucediendo.
Consulte la Programación Profesional de Windows PowerShell: Snapins, Cmdlets, Hosts y Proveedores (Wrox Professional Guides), ISBN: 0470173939 - es uno de los libros más útiles que he encontrado para escribir cmdlets y proveedores.
La fuente de Powershell ya está disponible en Github.
La fuente para Get-ChildItem
se puede encontrar here .