我们可以看到PowerShell cmdlet的源代码吗?

我正在学习一些PowerShell。 是否有可能看到像Get-ChildItem这样的内置cmdlet的源代码?

其实,你最好的选择是去看看PowerShell社区扩展 。 这个开源软件社区项目“旨在提供一套广泛使用的附加cmdlet …”。 该项目的开发人员是PowerShell MVP,并了解他们的内容。

至于在现有的PowerShell cmdlet上使用反射,PowerShell MVP Oisin Grehan提供了一个方便的函数“ Reflect-Cmdlet ”。 我不会偷他的代码,并把它放在这里,但基本上你所做的是:

Get-Command Get-ChildItem | Reflect-Cmdlet 

然后, .NET Reflector弹出,右边的程序集打开并展开。 这真的很酷。 这里有一个截图:

替代文字http://halr9000.com/images/screenshots/reflector.png

Powershell的源代码现在可以在Github上找到。
Get-ChildItem的来源可以在这里找到。

我想如果你刚刚启动PowerShell,这是你要找的东西:

 $metadata = New-Object system.management.automation.commandmetadata (Get-Command Get-Process) [System.management.automation.proxycommand]::Create($MetaData) | out-file C:\powershell\get-process.ps1 

这将创建一个脚本,显示Get-Process如何运行。 放入您要替换Get-Process的任何cmdlet。 如果你想更多地了解它,这就是你将如何创建一个代理功能。

对于已编译的Cmdlet,可以使用以下命令获取.dll的路径:

 (Get-Command Get-ChildItem).DLL 

(用您感兴趣的cmdlet替换Get-ChildItem

一旦你知道了.dll的路径,你可以用像dotPeek这样的.NET反汇编程序打开它:

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

我不相信PowerShell的源代码已经发布。

您可能还想看看CodePlex上的Windows Installer PowerShell管理单元 。 这是一个比社区扩展更小的项目,所以更容易让你的头脑发生什么事情。

查看专业版Windows PowerShell编程:Snapins,Cmdlet,主机和提供程序 (Wrox Professional Guides),ISBN:0470173939 – 这是我发现的用于编写cmdlet和提供程序的最有用的书籍之一。

您应该能够使用.NET Reflector “查看”源代码。 您需要知道程序集,但也应该使用GetType方法或类似方法访问它。

这个PowerShellLanguage .NET反射器加载项也许是有用的。

PowerShell cmdlet的程序集位于GAC中。 您可以在以下位置找到“Get-ChildItem”cmdlet:

Microsoft.PowerShell.Commands.Management程序集,Microsoft.PowerShell.Commands.GetChildItemCommand类。

我使用了ILSpy .NET反编译器,并通过“powershell”字符串过滤了GAC程序集。 据我所知, Microsoft.PowerShell.Commands。*程序集包含内置的cmdlet。

可以在参考资源网站上找到一些代码: http : //referencesource.microsoft.com/#System.Management.Automation/System/Management/Automation/ChildItemCmdletProviderIntrinsics.cs,c6eed9f6a5417c19

这只是给出了纲要, 不是代码的细节。