我正在学习一些PowerShell。是否可以查看内置cmdlet的源代码,如Get-ChildItem?
答案 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方法或类似方法访问它。
答案 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
属性中指定的文件)。