2008-11-05 20 views
27

Estoy aprendiendo algo de PowerShell. ¿Es posible ver el código fuente de un cmdlet integrado como Get-ChildItem?¿Podemos ver el código fuente de los cmdlets de PowerShell?

+0

Los binarios no son .NET, por lo que la reflexión es correcta. – Will

+3

¿Qué? No, eso es tonto. Actualizaré mi respuesta con algunas reflexiones. – halr9000

+1

Ahora puede - https://github.com/PowerShell/PowerShell/blob/HEAD/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs. – codekaizen

Respuesta

2

No creo que el código fuente de PowerShell haya sido lanzado alguna vez.

+0

Dudo que sea, tampoco. – alastairs

+3

Tengo menos dudas estos días ... – codekaizen

+0

Hay más código fuente abierto (ahora) de lo que la gente podría imaginar: [Blog de Windows PowerShell: El módulo de Archivo ahora es de código abierto] (https://blogs.msdn.microsoft. com/powershell/2016/04/25/the-archive-module-is-now-open-source /). –

2

Debería poder usar .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.

Esto PowerShellLanguage .NET Reflector Add-In puede ser útil.

+0

echa un vistazo a mi respuesta actualizada, ¡no necesita saber el montaje! – halr9000

19

En realidad, su mejor opción es ir a PowerShell Community Extensions. 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 a la reflexión sobre los cmdlets PowerShell existentes, PowerShell MVP Oisin Grehan realizó una práctica función titulada "Reflect-Cmdlet". No voy a robar su código y lo coloco aquí, pero básicamente lo que se hace es:

Get-Command Get-ChildItem | Reflect-Cmdlet 

Y luego .NET Reflector aparece con el conjunto de la derecha se abrió y se expandió y todo. Es realmente genial. Aquí hay una captura de pantalla:

Alt text http://halr9000.com/images/screenshots/reflector.png

+1

Sé que esto fue hace mucho tiempo, pero la captura de pantalla se ha ido. :) No importa mucho, solo para tu información. –

+1

Parece que está de vuelta, después de otro largo tiempo. – trysis

+4

+1 para el enlace a 'Reflect-Cmdlet', fue muy útil. Modificado para que funcione con Jetbrains DotPeek. https://gist.github.com/dennisroche/013c5a56d9a7f16851cb – Dennis

2

También te a echar un vistazo a Windows Installer PowerShell Snap-In 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.

Salida profesionales de Windows PowerShell Programación: SnapIns, cmdlets, anfitriones y proveedores (Wrox guías profesionales), ISBN: 0470173939 - es uno de los libros más útiles que he encontrado para cmdlets y proveedores de escritura.

1

Los ensambles de cmdlets de PowerShell se encuentran en GAC. Puede encontrar "Get-ChildItem" cmdlet:

montaje Microsoft.PowerShell.Commands.Management, Microsoft.PowerShell.Commands.GetChildItemCommand clase.

He utilizado el descompilador .NET de .NET y los conjuntos de GAC filtrados por la cadena "powershell". Según tengo entendido, Microsoft.PowerShell.Commands. * ensambles contienen cmdlets integrados.

9

creo que si se acaba de empezar PowerShell, esto es lo que se está 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á un script que muestra cómo Get-Process carreras. 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.

+0

Agradable y simple, sin necesidad de Reflector.NET o DotPeek, aplausos. Por cierto, '[System.management.automation.proxycommand] :: Create ($ MetaData)' parece suficiente para mí, solo para mostrar los resultados en la pantalla. –

+5

Esto crea un [comando proxy] (http://blogs.msdn.com/b/powershell/archive/2009/01/04/extendiendo-y-o-modificando-comandos-con-proxies.aspx), que no es No es lo mismo que mirar el código fuente en absoluto. Esto no le da el código fuente para Get-Process, o le muestra cómo se ejecuta; devuelve un script base que puede usar para modificar el cmdlet, por ejemplo, al agregarle parámetros adicionales. –

+0

crédito http://windowsitpro.com/blog/powershell-proxy-functions – Djarid

5

para los cmdlets compilados, se puede obtener la ruta a la .dll con:

(Get-Command Get-ChildItem).DLL 

(Reemplazar Get-ChildItem con el cmdlet le interesa)

Una vez que conoce la ruta a la .dll, se puede abrirlo con un desensamblador .NET como dotPeek:

& dotPeek64.exe (Get-Command Get-ChildItem).DLL 
13

The source for Powershell is now available on Github.
La fuente para Get-ChildItem se puede encontrar here.

+0

¿Qué sucede cuando la respuesta de una pregunta cambia de "no" a "sí"? –

+0

@GeekyI Presumiblemente, el OP (póster original) debería aceptar la nueva respuesta, en lugar de la respuesta previamente aceptada. Pero el OP nunca aceptó una respuesta de todos modos, ni tiene un perfil activo, así que supongo que no importa mucho. –

+0

Estoy de acuerdo, creo que acepto esta respuesta. –

Cuestiones relacionadas