2008-11-05 1 views
27

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

+0

Бинарники не являются .NET, поэтому отражение прямо. – Will 2008-11-05 19:30:32

+3

Что? Нет, это глупо. Я обновляю свой answesr с некоторыми размышлениями. – halr9000 2008-11-07 17:15:30

+1

Теперь вы можете: https://github.com/PowerShell/PowerShell/blob/HEAD/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs. – codekaizen 2016-08-21 16:46:06

ответ

2

Я не верю, что исходный код для PowerShell когда-либо был выпущен.

+0

Я сомневаюсь, что это произойдет. – alastairs 2008-11-12 00:17:06

+3

В последнее время у меня меньше сомнений ... – codekaizen 2014-11-23 09:02:38

+0

С открытым исходным кодом (сейчас) больше, чем могут себе представить: [Блог Windows PowerShell: модуль Archive теперь открыт с открытым исходным кодом] (https://blogs.msdn.microsoft. ком/PowerShell/2016/04/25 /-архив-модуль-это-теперь с открытым исходным кодом /). – 2016-05-11 11:34:53

2

Вы должны уметь использовать .NET Reflector, чтобы «видеть» исходный код. Однако вам нужно знать сборку, но она также должна быть доступна с использованием метода GetType или аналогичного.

Возможно, это PowerShellLanguage .NET Reflector Add-In.

19

На самом деле, ваш лучший выбор - пойти на выход PowerShell Community Extensions. Этот проект сообщества разработчиков программного обеспечения с открытым исходным кодом «предназначен для предоставления широкого набора дополнительных командлетов ...». Разработчики проекта - PowerShell MVP и знают их.

Что касается использования существующих командлетов PowerShell, PowerShell MVP Oisin Grehan сделал удобную функцию под названием «Reflect-Cmdlet». Я не украсть его код и разместить его здесь, но в основном то, что вы делаете:

Get-Command Get-ChildItem | Reflect-Cmdlet 

А потом .NET Reflector выскакивает с правом сборки раскрылась и расширяется, и все. Это действительно здорово. Вот скриншот:

Alt text http://halr9000.com/images/screenshots/reflector.png

2

Вы могли бы также взглянуть на Windows Installer PowerShell Snap-In на CodePlex. Это меньший проект, чем расширения сообщества, так что легче понять, что происходит.

Заканчивать Professional Windows PowerShell Программирование: Snapins, Командлеты, хосты и провайдеры (Wrox Профессиональные проводники), ISBN: 0470173939 - это одна из самых полезных книг, которые я нашел для написания командлетов и поставщиков.

1

Компоненты командлетов PowerShell расположены в GAC. Вы можете найти "Get-ChildItem" Командлет в:

Microsoft.PowerShell.Commands.Management сборки, Microsoft.PowerShell.Commands.GetChildItemCommand класс.

Я использовал декомпилятор ILSpy .NET и отфильтрованные сборки GAC с помощью строки «powershell». Как я понимаю, Microsoft.PowerShell.Commands. * сборки содержат встроенные командлеты.

9

Я думаю, если вы только начинаете 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. Если вы хотите больше узнать об этом Google, так вы создадите прокси-функцию.

5

Для скомпилированных командлетов, вы можете получить путь к .dll с:

(Get-Command Get-ChildItem).DLL 

(Заменить Get-ChildItem с помощью командлета вы заинтересованы в)

После того, как вы знаете, путь к .dll, вам может открыть его с .NET дизассемблера как dotPeek:

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

 Смежные вопросы

  • Нет связанных вопросов^_^