我们能否查看PowerShell cmdlets的源代码?

42

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


2
您现在可以访问以下链接:https://github.com/PowerShell/PowerShell/blob/HEAD/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs。 - codekaizen
10个回答

35

22

实际上,你最好去查看PowerShell社区扩展。这个开源软件社区项目旨在提供“广泛有用的其他cmdlet集合…。”。该项目的开发人员是PowerShell MVP并且非常专业。

至于在现有的PowerShell cmdlet上使用反射, PowerShell MVP Oisin Grehan编写了一个方便的函数名为“Reflect-Cmdlet”。我不会在这里贴出他的代码,但基本上你所做的是:

Get-Command Get-ChildItem | Reflect-Cmdlet

然后.NET Reflector就弹出来了,正确的程序集也被打开并展开了。这真的很酷。


5
感谢提供 Reflect-Cmdlet 的链接,它非常有帮助。我已经修改了代码,使其能够与Jetbrains DotPeek一起使用。https://gist.github.com/dennisroche/013c5a56d9a7f16851cb - Dennis
该 cmd-let 具有无效的 SSL 证书。这似乎也可以是可能不使用任何第三方工具 - Liam

16

对于编译的Cmdlets,您可以通过以下方式获取.dll文件的路径:

(Get-Command Get-ChildItem).DLL

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

示例:

PS C:\Windows\system32> (Get-Command Get-StoragePool).DLL

PS C:\Windows\system32> 

知道了 .dll 的路径后,你可以使用像 dotPeek 这样的 .NET 反编译器打开它:

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

有趣的是,在 PowerShell 7.0 中似乎无法使用 DnsClient 模块。例如,Get-Module DnsClient|Get-Member 不显示 DLL 属性/成员。 - 0xC0000022L

14

我认为如果你刚开始学习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即可。如果您想要更多关于它的信息,请搜索如何创建代理函数。


很好,简单明了,不需要使用Reflector.NET或DotPeek,干杯。顺便说一下,[System.management.automation.proxycommand]::Create($MetaData) 对我来说已经足够了,只需在屏幕上显示结果。 - Simon Elms
7
这将创建一个代理命令,并不同于查看源代码。这并不会给你Get-Process的源代码,或者展示它运行的方式;它只会返回一个基础脚本,可以用来修改该命令,例如添加额外的参数。 - Micah R Ledbetter

3
你可能也想看看 CodePlex 上的 Windows Installer PowerShell Snap-In。它是一个比社区扩展更小的项目,所以更容易理解其中的内容。
看一下《Professional Windows PowerShell Programming:Snapins,Cmdlets,Hosts 和 Providers》(Wrox 专业指南),ISBN:0470173939——这是我发现用于编写 cmdlet 和 provider 最有用的书籍之一。

2

1

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

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

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


1

对于一些使用Install-Module安装且包含源代码而非二进制文件的命令(cmdlets),例如PSnmap:

Install-Module -Name PSnmap

如果您想查看他们的代码,可以查看以下位置的Definition属性:

Get-Command Invoke-PSnmap | Format-List

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

0

-1

我不相信PowerShell的源代码曾经被公开发布过。


1
现在有更多的开源代码,比人们想象的要多:Windows PowerShell博客:Archive模块现已开源 - Charlie Joynt
3
PowerShell现在是开源的。 - Zev Spitz
完全过时的答案。 - stackprotector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接