Я изучаю PowerShell. Возможно ли увидеть исходный код встроенного командлета, например Get-ChildItem?
Можем ли мы увидеть исходный код командлетов PowerShell?
Ответ 1
На самом деле, лучше всего пойти на выход Расширения сообщества PowerShell. Этот проект сообщества разработчиков программного обеспечения с открытым исходным кодом "предназначен для предоставления широкого набора дополнительных командлетов...". Разработчики проекта - MVP PowerShell и знают их.
Что касается использования рефлексии для существующих командлетов PowerShell, PowerShell MVP Oisin Grehan сделал удобную функцию под названием " Reflect-Cmdlet". Я не буду красть его код и разместить его здесь, но в основном вы делаете:
Get-Command Get-ChildItem | Reflect-Cmdlet
И затем .NET Reflector появляется с открытой сборкой, которая открывается и расширяется, и все. Это действительно здорово. Вот скриншот:
Alt текст http://halr9000.com/images/screenshots/reflector.png
Ответ 2
Источник для Powershell теперь доступен на Github.
Источник Get-ChildItem
можно найти здесь.
Ответ 3
Я думаю, если бы вы только начали 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
Это создаст script, который покажет, как работает Get-Process. Поместите в любой командлет, который вы хотите заменить Get-Process. Если вы хотите больше узнать об этом Google, так вы создадите прокси-функцию.
Ответ 4
Для скомпилированных командлетов вы можете получить путь к .dll
с помощью:
(Get-Command Get-ChildItem).DLL
(Замените Get-ChildItem
на интересующий вас командлет)
Как только вы узнаете путь к .dll
, вы можете открыть его с помощью дизассемблера .NET, например dotPeek:
& dotPeek64.exe (Get-Command Get-ChildItem).DLL
Ответ 5
Я не верю, что исходный код для PowerShell когда-либо был выпущен.
Ответ 6
Вы можете использовать .NET Reflector, чтобы "видеть" исходный код. Однако вам нужно знать сборку, но она также должна быть доступна с использованием метода GetType или аналогичного.
Этот PowerShellLanguage.NET Reflector Add-In может быть полезен.
Ответ 7
Вам также может понравиться "Узел установки Windows PowerShell Snap-In" на CodePlex. Это меньший проект, чем расширения сообщества, так что легче понять, что происходит.
Ознакомьтесь с профессиональным программированием Windows PowerShell: Snapins, командлеты, хосты и поставщики (Wrox Professional Guides), ISBN: 0470173939 - это одна из самых полезных книг, которые я нашел для написания командлетов и поставщиков.
Ответ 8
Сборки командлетов PowerShell расположены в GAC. Командлет Get-ChildItem можно найти в:
сборка Microsoft.PowerShell.Commands.Management, класс Microsoft.PowerShell.Commands.GetChildItemCommand.
Я использовал декомпилятор ILSpy.NET и отфильтрованные сборки GAC с помощью строки "powershell". Как я понимаю, сборки Microsoft.PowerShell.Commands. * содержат встроенные командлеты.
Ответ 9
Некоторый код можно найти на сайте справочного ресурса: http://referencesource.microsoft.com/#System.Management.Automation/System/Management/Automation/ChildItemCmdletProviderIntrinsics.cs,c6eed9f6a5417c19
Это только дает схему; а не детали кода.