2008-11-05 10 views
27

Uczę się niektórych PowerShell. Czy jest możliwe wyświetlenie kodu źródłowego dla wbudowanego polecenia cmdlet, takiego jak Get-ChildItem?Czy widzimy kod źródłowy dla poleceń cmdlet programu PowerShell?

+0

Pliki binarne nie są .NET, więc odbicie jest prawidłowe. – Will

+3

Co? Nie, to głupie. Zaktualizuję mój odpowiednik, dodając kilka refleksji. – halr9000

+1

Możesz teraz - https://github.com/PowerShell/PowerShell/blob/HEAD/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs. – codekaizen

Odpowiedz

2

Nie wierzę, że kod źródłowy programu PowerShell został kiedykolwiek wydany.

+0

Wątpię, czy to będzie. – alastairs

+3

Mam teraz mniej wątpliwości ... – codekaizen

+0

Istnieje więcej kodu open source (teraz) niż ludzie mogą sobie wyobrazić: [blog Windows PowerShell: moduł Archive jest teraz open-source] (https://blogs.msdn.microsoft. com/powershell/2016/04/25/the-archive-module-is-now-open-source /). –

2

Powinieneś być w stanie użyć .NET Reflector, aby "zobaczyć" kod źródłowy. Trzeba jednak znać zespół, ale powinien on również być dostępny za pomocą metody GetType lub podobnej.

Ten numer PowerShellLanguage .NET Reflector Add-In może być przydatny.

+0

Sprawdź moją zaktualizowaną odpowiedź, nie musisz znać zestawu! – halr9000

19

Właściwie najlepiej jest sprawdzić płatność PowerShell Community Extensions. Ten projekt społeczności oprogramowania open source ma "na celu dostarczenie użytecznego zestawu dodatkowych poleceń cmdlet ...". Deweloperzy projektu to PowerShell MVP i znają się na nich.

O ile korzystanie z poleceń cmdlet PowerShell, PowerShell MVP Oisin Grehan wykonał przydatną funkcję zatytułowaną "Reflect-Cmdlet". Nie będę ukraść jego kod i umieścić go tutaj, ale w zasadzie to, co robisz jest:

Get-Command Get-ChildItem | Reflect-Cmdlet 

A potem .NET Reflector wyskakuje z prawem montaż otwarte i rozszerzony i wszystko. To naprawdę fajne. Oto zrzut ekranu:

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

+1

Wiem, że to dawno temu, ale zrzut ekranu zniknął. :) Nie ma większego znaczenia, tylko FYI. –

+1

Wygląda, jakby wrócił, po innym długim czasie. – trysis

+4

+1 dla linku do 'Reflect-Cmdlet', było bardzo pomocne. Zmodyfikowany, aby działał z Jetbrains DotPeek. https://gist.github.com/dennisroche/013c5a56d9a7f16851cb – Dennis

2

polubisz też spojrzeć na Windows Installer PowerShell Snap-In na CodePlex. Jest to mniejszy projekt niż rozszerzenia społeczności, więc łatwiej jest zorientować się, co się dzieje.

Wyjazd Profesjonalne Windows PowerShell Programowanie: SNAPINS, cmdlets, gospodarze i dostawcy (Wrox profesjonalnymi przewodnikami), ISBN: 0470173939 - to jeden z najbardziej przydatnych książek znalazłem na piśmie cmdlets i dostawców.

1

Złożeń cmdlet PowerShell znajduje się w GAC. Można znaleźć "Get-ChildItem" cmdlet w:

montażu Microsoft.PowerShell.Commands.Management, Microsoft.PowerShell.Commands.GetChildItemCommand klasa.

Użyłem dekompilatora ILSpy .NET i filtrowanych złożeń GAC za pomocą ciągu "powershell". Jak rozumiem, zespoły Microsoft.PowerShell.Commands. *złożeń zawierają wbudowane polecenia cmdlet.

9

myślę, że jeśli po prostu zaczynając PowerShell, to jest to, czego można się szuka:

$metadata = New-Object system.management.automation.commandmetadata (Get-Command Get-Process) 
[System.management.automation.proxycommand]::Create($MetaData) | out-file C:\powershell\get-process.ps1 

To będzie utworzyć skrypt, który pokazuje jak Get-Process przebiegów. Wstaw cmdlet, który chcesz zastąpić Get-Process. Jeśli chcesz dowiedzieć się więcej o Google, w ten sposób utworzysz funkcję proxy.

+0

Ładne i proste, nie ma potrzeby korzystania z Reflector.NET lub DotPeek, okrzyki. Nawiasem mówiąc, "[System.management.automation.proxycommand] :: Create ($ MetaData)" wydaje mi się wystarczające, aby wyświetlić wyniki na ekranie. –

+5

Spowoduje to utworzenie polecenia [proxy] (http://blogs.msdn.com/b/powershell/archive/2009/01/04/extending-and-or-modifing-commands-with-proxies.aspx), które nie jest dostępne To samo, co w ogóle spojrzenie na kod źródłowy. To nie daje kodu źródłowego dla procesu Get-Process ani nie pokazuje, jak działa; zwraca skrypt bazowy, którego można użyć do zmodyfikowania polecenia cmdlet, na przykład poprzez dodanie do niego dodatkowych parametrów. –

+0

kredyt http://windowsitpro.com/blog/powershell-proxy-functions – Djarid

5

Dla zebranych poleceń cmdlet, można uzyskać ścieżkę do .dll z:

(Get-Command Get-ChildItem).DLL 

(Wymień Get-ChildItem z cmdletu jesteś zainteresowany)

Gdy wiesz ścieżkę do .dll, ty można go otworzyć z disassembler .NET jak dotPeek:

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

The source for Powershell is now available on Github.
Źródło dla Get-ChildItem można znaleźć here.

+0

Co stanie się, gdy odpowiedź na pytanie zmieni się z "nie" na "tak"? –

+0

@GeekyI Przypuszczalnie OP (oryginalny plakat) powinien zaakceptować nową odpowiedź zamiast poprzednio zaakceptowanej odpowiedzi. Ale OP nigdy nie przyjął odpowiedzi, ani nie ma aktywnego profilu, więc przypuszczam, że nie ma to większego znaczenia. –

+0

Zgadzam się, myślę, że przyjmij tę odpowiedź. –

Powiązane problemy