【发布时间】:2010-09-20 22:38:03
【问题描述】:
我正在学习一些 PowerShell。是否可以看到像 Get-ChildItem 这样的内置 cmdlet 的源代码?
【问题讨论】:
-
二进制文件不是 .NET,所以反射是正确的。
-
什么?不,这很愚蠢。我会用一些反思的东西更新我的答案。
标签: windows powershell cmdlets
我正在学习一些 PowerShell。是否可以看到像 Get-ChildItem 这样的内置 cmdlet 的源代码?
【问题讨论】:
标签: windows powershell cmdlets
我不相信 PowerShell 的源代码曾经发布过。
【讨论】:
您应该可以使用.NET Reflector“查看”源代码。您需要了解程序集,但也应该使用 GetType 方法或类似方法访问它。
【讨论】:
实际上,您最好的选择是去查看PowerShell Community Extensions。这个开源软件社区项目“旨在提供一组广泛有用的附加 cmdlet……”。该项目的开发人员是 PowerShell MVP 并且知道他们的东西。
就在现有 PowerShell cmdlet 上使用反射而言,PowerShell MVP Oisin Grehan 制作了一个名为“Reflect-Cmdlet”的便捷函数。我不会窃取他的代码并将其放在这里,但基本上你要做的是:
Get-Command Get-ChildItem | Reflect-Cmdlet
然后.NET Reflector 弹出并打开并扩展了正确的程序集以及所有内容。真的很酷。
【讨论】:
Reflect-Cmdlet,非常有帮助。已修改以使其与 Jetbrains DotPeek 一起使用。 gist.github.com/dennisroche/013c5a56d9a7f16851cb
您可能还想看看 CodePlex 上的Windows Installer PowerShell Snap-In。这是一个比社区扩展更小的项目,因此更容易了解正在发生的事情。
查看Professional Windows PowerShell Programming: Snapins、Cmdlet、Hosts and Providers(Wrox 专业指南),ISBN:0470173939 - 这是我找到的用于编写 cmdlet 和提供程序的最有用的书籍之一.
【讨论】:
PowerShell cmdlet 的程序集位于 GAC 中。您可以在以下位置找到“Get-ChildItem”cmdlet:
Microsoft.PowerShell.Commands.Management 程序集,Microsoft.PowerShell.Commands.GetChildItemCommand 类。
我使用了 ILSpy .NET 反编译器并通过“powershell”字符串过滤了 GAC 程序集。据我了解,Microsoft.PowerShell.Commands.* 程序集包含内置 cmdlet。
【讨论】:
我认为如果您刚开始使用 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 上了解更多信息,这就是您创建代理功能的方式。
【讨论】:
[System.management.automation.proxycommand]::Create($MetaData) 对我来说似乎足够了,只需在屏幕上显示结果。
一些代码可以在参考资源网站上找到: http://referencesource.microsoft.com/#System.Management.Automation/System/Management/Automation/ChildItemCmdletProviderIntrinsics.cs,c6eed9f6a5417c19
这只是给出了大纲;不是代码的详细信息。
【讨论】:
对于已编译 Cmdlet,您可以通过以下方式获取.dll 的路径:
(Get-Command Get-ChildItem).DLL
(将Get-ChildItem替换为您感兴趣的cmdlet)
一旦知道.dll 的路径,就可以使用.NET 反汇编程序打开它,例如dotPeek:
& dotPeek64.exe (Get-Command Get-ChildItem).DLL
【讨论】:
Get-Module DnsClient|Get-Member 没有显示 DLL 属性/成员。
The source for Powershell is now available on Github.Get-ChildItem的来源可以在here找到。
【讨论】:
对于使用Install-Module 安装且包含源代码而非二进制文件的某些 cmdlet(例如 PSnmap):
Install-Module -Name PSnmap
...您可以通过查看Definition 属性来查看他们的代码:
Get-Command Invoke-PSnmap | Format-List
如果没有,您很可能需要反编译一些二进制文件(例如,DLL 属性中指定的文件)。
【讨论】: