Я изучаю PowerShell. Возможно ли увидеть исходный код встроенного командлета, например Get-ChildItem?Можем ли мы увидеть исходный код командлетов PowerShell?
ответ
Я не верю, что исходный код для PowerShell когда-либо был выпущен.
Я сомневаюсь, что это произойдет. – alastairs 2008-11-12 00:17:06
В последнее время у меня меньше сомнений ... – codekaizen 2014-11-23 09:02:38
С открытым исходным кодом (сейчас) больше, чем могут себе представить: [Блог Windows PowerShell: модуль Archive теперь открыт с открытым исходным кодом] (https://blogs.msdn.microsoft. ком/PowerShell/2016/04/25 /-архив-модуль-это-теперь с открытым исходным кодом /). – 2016-05-11 11:34:53
Вы должны уметь использовать .NET Reflector, чтобы «видеть» исходный код. Однако вам нужно знать сборку, но она также должна быть доступна с использованием метода GetType или аналогичного.
Возможно, это PowerShellLanguage .NET Reflector Add-In.
На самом деле, ваш лучший выбор - пойти на выход 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
Вы могли бы также взглянуть на Windows Installer PowerShell Snap-In на CodePlex. Это меньший проект, чем расширения сообщества, так что легче понять, что происходит.
Заканчивать Professional Windows PowerShell Программирование: Snapins, Командлеты, хосты и провайдеры (Wrox Профессиональные проводники), ISBN: 0470173939 - это одна из самых полезных книг, которые я нашел для написания командлетов и поставщиков.
Компоненты командлетов PowerShell расположены в GAC. Вы можете найти "Get-ChildItem" Командлет в:
Microsoft.PowerShell.Commands.Management сборки, Microsoft.PowerShell.Commands.GetChildItemCommand класс.
Я использовал декомпилятор ILSpy .NET и отфильтрованные сборки GAC с помощью строки «powershell». Как я понимаю, Microsoft.PowerShell.Commands. * сборки содержат встроенные командлеты.
Я думаю, если вы только начинаете 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, так вы создадите прокси-функцию.
Некоторые код можно найти на справочном сайте ресурсов: http://referencesource.microsoft.com/#System.Management.Automation/System/Management/Automation/ChildItemCmdletProviderIntrinsics.cs,c6eed9f6a5417c19
Это дает только набросок, хотя; а не детали кода.
Для скомпилированных командлетов, вы можете получить путь к .dll
с:
(Get-Command Get-ChildItem).DLL
(Заменить Get-ChildItem
с помощью командлета вы заинтересованы в)
После того, как вы знаете, путь к .dll
, вам может открыть его с .NET дизассемблера как dotPeek:
& dotPeek64.exe (Get-Command Get-ChildItem).DLL
The source for Powershell is now available on Github.
Источник для Get-ChildItem
можно найти here.
Бинарники не являются .NET, поэтому отражение прямо. – Will 2008-11-05 19:30:32
Что? Нет, это глупо. Я обновляю свой answesr с некоторыми размышлениями. – halr9000 2008-11-07 17:15:30
Теперь вы можете: https://github.com/PowerShell/PowerShell/blob/HEAD/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs. – codekaizen 2016-08-21 16:46:06