Подтвердить что ты не робот

Можем ли мы увидеть исходный код командлетов PowerShell?

Я изучаю PowerShell. Возможно ли увидеть исходный код встроенного командлета, например Get-ChildItem?

4b9b3361

Ответ 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

Ответ 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. * содержат встроенные командлеты.