script windows powershell cmdlets

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.



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



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.