我正在学习一些 PowerShell。是否可以查看像Get-ChildItem这样的内置 cmdlet 的源代码?
10 回答
Powershell 的源代码现已在 Github 上提供。可以在这里
找到
源代码。Get-ChildItem
实际上,最好的办法是去看看PowerShell Community Extensions。这个开源软件社区项目“旨在提供一组广泛有用的附加 cmdlet……”。该项目的开发人员是 PowerShell MVP 并且知道他们的东西。
至于在现有 PowerShell cmdlet 上使用反射,PowerShell MVP Oisin Grehan 制作了一个名为“ Reflect-Cmdlet ”的方便函数。我不会窃取他的代码并将其放在这里,但基本上你要做的是:
Get-Command Get-ChildItem | Reflect-Cmdlet
然后.NET Reflector弹出并打开并展开正确的程序集以及所有内容。这真的很酷。
我想如果你刚开始使用 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。如果您想在 Google 上搜索更多信息,这就是您创建代理功能的方式。
对于已编译的 Cmdlet,您可以获得以下路径.dll
:
(Get-Command Get-ChildItem).DLL
(替换Get-ChildItem
为您感兴趣的 cmdlet)
一旦知道 .NET 的路径.dll
,就可以使用 .NET 反汇编程序(如dotPeek)打开它:
& dotPeek64.exe (Get-Command Get-ChildItem).DLL
您可能还想查看 CodePlex 上的Windows Installer PowerShell 管理单元。这是一个比社区扩展更小的项目,因此更容易了解正在发生的事情。
查看Professional Windows PowerShell Programming: Snapins, Cmdlet, Hosts and Providers (Wrox Professional Guides), ISBN: 0470173939 - 这是我发现的用于编写 cmdlet 和提供程序的最有用的书籍之一。
您应该能够使用.NET Reflector来“查看”源代码。您需要了解程序集,但也应该使用 GetType 方法或类似方法访问它。
PowerShell cmdlet 的程序集位于 GAC 中。您可以在以下位置找到“Get-ChildItem”cmdlet:
Microsoft.PowerShell.Commands.Management 程序集,Microsoft.PowerShell.Commands.GetChildItemCommand类。
我使用了 ILSpy .NET 反编译器并通过“powershell”字符串过滤了 GAC 程序集。据我了解,Microsoft.PowerShell.Commands.*程序集包含内置 cmdlet。
我不相信 PowerShell 的源代码曾经发布过。
可以在参考资源站点上找到一些代码: http ://referencesource.microsoft.com/#System.Management.Automation/System/Management/Automation/ChildItemCmdletProviderIntrinsics.cs,c6eed9f6a5417c19
不过,这只给出了大纲;不是代码的详细信息。
对于某些安装Install-Module
并包含源代码而非二进制文件的 cmdlet(例如 PSnmap):
Install-Module -Name PSnmap
...您可以通过查看以下Definition
属性来查看他们的代码:
Get-Command Invoke-PSnmap | Format-List
如果没有,很可能您需要反编译一些二进制文件(例如,在DLL
属性中指定的文件)。