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

时间:2008-11-05 19:21:05

标签: windows powershell cmdlets

我正在学习一些PowerShell。是否可以查看内置cmdlet的源代码,如Get-ChildItem

10 个答案:

答案 0 :(得分:21)

实际上,最好的办法是结账PowerShell Community Extensions。这个开源软件社区项目“旨在提供一组广泛使用的附加cmdlet ......”。该项目的开发人员是PowerShell MVP并了解他们的东西。

就在现有PowerShell cmdlet上使用反射而言,PowerShell MVP Oisin Grehan创建了一个名为“Reflect-Cmdlet”的便捷功能。我不会窃取他的代码并把它放在这里,但基本上你做的是:

Get-Command Get-ChildItem | Reflect-Cmdlet

然后.NET Reflector弹出正确的组件打开并扩展所有内容。这真的很酷。这是一个截图:

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

答案 1 :(得分:17)

The source for Powershell is now available on Github.
可以找到Get-ChildItem的来源{。{3}}。

答案 2 :(得分:10)

我想如果你刚刚开始使用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。如果你想谷歌更多关于它,这就是你如何创建代理功能。

答案 3 :(得分:5)

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

(Get-Command Get-ChildItem).DLL

(将Get-ChildItem替换为您感兴趣的cmdlet)

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

PowerShellLanguage .NET Reflector Add-In可能有用。

答案 6 :(得分:2)

您可能还想查看CodePlex上的Windows Installer PowerShell Snap-In。这是一个比社区扩展更小的项目,因此更容易了解正在发生的事情。

查看专业版Windows PowerShell编程:Snapins,Cmdlet,主机和提供程序(Wrox专业指南),ISBN:0470173939 - 这是我找到的用于编写cmdlet和提供程序的最有用的书籍之一

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:0)

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

这只是给出了轮廓;不是代码的细节。

答案 9 :(得分:0)

对于一些使用 Install-Module 安装并包含源代码而不是二进制文件的 cmdlet,(例如 PSnmap):

Install-Module -Name PSnmap

...您可以通过查看以下来源的 Definition 属性来查看他们的代码:

Get-Command Invoke-PSnmap | Format-List

如果没有,您很可能需要反编译一些二进制文件(例如 DLL 属性中指定的文件)。