我正在学习一些PowerShell。 是否有可能看到像Get-ChildItem这样的内置cmdlet的源代码?
其实,你最好的选择是去看看PowerShell社区扩展 。 这个开源软件社区项目“旨在提供一套广泛使用的附加cmdlet …”。 该项目的开发人员是PowerShell MVP,并了解他们的内容。
至于在现有的PowerShell cmdlet上使用反射,PowerShell MVP Oisin Grehan提供了一个方便的函数“ Reflect-Cmdlet ”。 我不会偷他的代码,并把它放在这里,但基本上你所做的是:
Get-Command Get-ChildItem | Reflect-Cmdlet
然后, .NET Reflector弹出,右边的程序集打开并展开。 这真的很酷。 这里有一个截图:
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
这只是给出了纲要, 不是代码的细节。