我正在学习一些PowerShell。是否可以查看内置 cmdlet(例如Get-ChildItem)的源代码?
我正在学习一些PowerShell。是否可以查看内置 cmdlet(例如Get-ChildItem)的源代码?
实际上,你最好去查看PowerShell社区扩展。这个开源软件社区项目旨在提供“广泛有用的其他cmdlet集合…。”。该项目的开发人员是PowerShell MVP并且非常专业。
至于在现有的PowerShell cmdlet上使用反射, PowerShell MVP Oisin Grehan编写了一个方便的函数名为“Reflect-Cmdlet”。我不会在这里贴出他的代码,但基本上你所做的是:
Get-Command Get-ChildItem | Reflect-Cmdlet
然后.NET Reflector就弹出来了,正确的程序集也被打开并展开了。这真的很酷。
Reflect-Cmdlet
的链接,它非常有帮助。我已经修改了代码,使其能够与Jetbrains DotPeek一起使用。https://gist.github.com/dennisroche/013c5a56d9a7f16851cb - Dennis对于编译的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
Get-Module DnsClient|Get-Member
不显示 DLL 属性/成员。 - 0xC0000022L我认为如果你刚开始学习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即可。如果您想要更多关于它的信息,请搜索如何创建代理函数。
[System.management.automation.proxycommand]::Create($MetaData)
对我来说已经足够了,只需在屏幕上显示结果。 - Simon ElmsPowerShell cmdlets的程序集位于GAC中。您可以在以下位置找到“Get-ChildItem” cmdlet:
Microsoft.PowerShell.Commands.Management程序集,Microsoft.PowerShell.Commands.GetChildItemCommand类。
我使用了ILSpy .NET反编译器,并通过“powershell”字符串过滤了GAC程序集。据我所知,Microsoft.PowerShell.Commands.*程序集包含内置的cmdlet。
对于一些使用Install-Module
安装且包含源代码而非二进制文件的命令(cmdlets),例如PSnmap:
Install-Module -Name PSnmap
如果您想查看他们的代码,可以查看以下位置的Definition
属性:
Get-Command Invoke-PSnmap | Format-List
DLL
属性中指定的文件)。一些代码可以在参考资源网站上找到: http://referencesource.microsoft.com/#System.Management.Automation/System/Management/Automation/ChildItemCmdletProviderIntrinsics.cs,c6eed9f6a5417c19
这只是提供了概述,而不是代码的详细信息。
我不相信PowerShell的源代码曾经被公开发布过。