Можем ли мы увидеть исходный код для командлетов PowerShell? - PullRequest
31 голосов
/ 05 ноября 2008

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

Ответы [ 9 ]

21 голосов
/ 06 ноября 2008

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

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

Get-Command Get-ChildItem | Reflect-Cmdlet

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

Альтернативный текст http://halr9000.com/images/screenshots/reflector.png

17 голосов
/ 20 августа 2016

Источник для Powershell теперь доступен на Github.
Источник для Get-ChildItem можно найти здесь .

10 голосов
/ 10 декабря 2013

Я думаю, что если вы только запускаете 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 голосов
/ 24 августа 2015

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

(Get-Command Get-ChildItem).DLL

(замените Get-ChildItem на интересующий вас командлет)

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

& dotPeek64.exe (Get-Command Get-ChildItem).DLL
2 голосов
/ 09 июля 2009

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

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

2 голосов
/ 05 ноября 2008

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

Эта PowerShellLanguage .NET Reflector Add-In может быть полезна.

2 голосов
/ 05 ноября 2008

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

1 голос
/ 14 декабря 2011

Сборки командлетов PowerShell находятся в GAC. Командлет Get-ChildItem можно найти в:

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

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

0 голосов
/ 12 августа 2015

Некоторый код можно найти на сайте справочных ресурсов: http://referencesource.microsoft.com/#System.Management.Automation/System/Management/Automation/ChildItemCmdletProviderIntrinsics.cs,c6eed9f6a5417c19

Это только дает схему, хотя; не детали кода.

...