2008-11-05 28 views
27

Tôi đang học một số PowerShell. Có thể xem mã nguồn cho lệnh ghép ngắn tích hợp như Get-ChildItem không?Chúng ta có thể thấy mã nguồn cho lệnh ghép ngắn PowerShell không?

+0

Các tệp nhị phân không phải là .NET. Vì vậy, việc phản chiếu là đúng. – Will

+3

Cái gì? Không, đó là ngớ ngẩn. Tôi sẽ cập nhật trả lời của tôi với một số công cụ phản ánh. – halr9000

+1

Bây giờ bạn có thể - https://github.com/PowerShell/PowerShell/blob/HEAD/src/Microsoft.PowerShell.Commands.Management/commands/management/GetChildrenCommand.cs. – codekaizen

Trả lời

2

Tôi không tin rằng mã nguồn cho PowerShell đã từng được phát hành.

+0

Tôi nghi ngờ nó sẽ là một trong hai. – alastairs

+3

Tôi ít nghi ngờ những ngày này ... – codekaizen

+0

Hiện có nhiều mã nguồn mở hơn (bây giờ) hơn mọi người có thể tưởng tượng: [Windows PowerShell blog: Mô-đun lưu trữ giờ đây là mã nguồn mở] (https://blogs.msdn.microsoft. com/powershell/2016/04/25/the-archive-module-là-now-open-source /). –

2

Bạn sẽ có thể sử dụng .NET Reflector để "xem" mã nguồn. Bạn cần phải biết lắp ráp, mặc dù nó cũng có thể truy cập bằng phương thức GetType hoặc tương tự.

Điều này có nghĩa là PowerShellLanguage .NET Reflector Add-In có thể hữu ích.

+0

kiểm tra câu trả lời cập nhật của tôi, bạn không cần phải biết lắp ráp! – halr9000

19

Thực ra, đặt cược tốt nhất của bạn là đi kiểm tra PowerShell Community Extensions. Dự án cộng đồng phần mềm mã nguồn mở này là "nhằm cung cấp một tập hợp các lệnh ghép ngắn hữu ích rộng rãi hơn ...". Các nhà phát triển trên dự án là PowerShell MVPs và biết công cụ của họ.

Khi sử dụng phản ánh trên các lệnh ghép ngắn PowerShell hiện có, PowerShell MVP Oisin Grehan đã thực hiện một chức năng tiện dụng có tiêu đề "Reflect-Cmdlet". Tôi sẽ không ăn cắp mã của mình và đặt nó ở đây, nhưng về cơ bản những gì bạn làm là:

Get-Command Get-ChildItem | Reflect-Cmdlet 

Và sau đó .NET Reflector bật lên với việc lắp ráp đúng mở ra và mở rộng và tất cả mọi thứ. Nó thực sự khá tuyệt. Dưới đây là một ảnh chụp màn hình:

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

+1

Tôi biết điều này là một thời gian dài trước đây, nhưng ảnh chụp màn hình đã biến mất. :) Không quan trọng lắm, chỉ là FYI. –

+1

Có vẻ như nó đã trở lại, sau một thời gian dài. – trysis

+4

+1 cho liên kết đến 'Reflect-Cmdlet', nó rất hữu ích. Sửa đổi để làm cho nó hoạt động với Jetbrains DotPeek. https://gist.github.com/dennisroche/013c5a56d9a7f16851cb – Dennis

2

Bạn cũng có thể muốn có một cái nhìn tại Windows Installer PowerShell Snap-In trên CodePlex. Đó là một dự án nhỏ hơn so với các phần mở rộng của cộng đồng, vì vậy nó dễ dàng hơn để có được đầu của bạn xung quanh những gì đang xảy ra.

Check-out Professional Windows PowerShell Lập trình: Snapin, Cmdlets, máy chủ và các nhà cung cấp (Wrox Professional Guides), ISBN: 0470173939 - đó là một trong những cuốn sách hữu ích nhất mà tôi đã tìm thấy để viết lệnh và các nhà cung cấp.

1

Hội đồng ghép ngắn PowerShell được đặt trong GAC. Bạn có thể tìm thấy lệnh ghép ngắn "Get-ChildItem" trong:

Microsoft.PowerShell.Commands.GetChildItemCommand lớp.

Tôi đã sử dụng trình giải mã ILSpy .NET và bộ lọc GAC được lọc theo chuỗi "powershell". Theo tôi hiểu, Microsoft.PowerShell.Commands. * hội đồng có chứa các lệnh ghép ngắn được cài sẵn.

9

Tôi nghĩ rằng nếu bạn chỉ mới bắt đầu PowerShell, đây là những gì bạn muốn được tìm kiếm:

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

này sẽ tạo ra một kịch bản trong đó cho thấy cách Get-Process chạy. Đặt trong bất kỳ lệnh ghép ngắn nào bạn muốn thay thế Get-Process. Nếu bạn muốn google thêm về nó, đây là cách bạn sẽ tạo ra một chức năng proxy.

+0

Đẹp và đơn giản, không cần Reflector.NET hoặc DotPeek, cổ vũ. Nhân tiện, '[System.management.automation.proxycommand] :: Tạo ($ MetaData)' dường như đủ cho tôi, để chỉ hiển thị kết quả trên màn hình. –

+5

Điều này tạo ra một [lệnh proxy] (http://blogs.msdn.com/b/powershell/archive/2009/01/04/extending-and-or-modifing-commands-with-proxies.aspx), mà isn không giống như nhìn vào mã nguồn. Điều này không cung cấp cho bạn mã nguồn để Nhận quy trình hoặc chỉ cho bạn cách chạy; nó trả về một kịch bản cơ sở mà bạn có thể sử dụng để sửa đổi lệnh ghép ngắn, ví dụ, bằng cách thêm các tham số bổ sung vào nó. –

+0

tín dụng http://windowsitpro.com/blog/powershell-proxy-functions – Djarid

5

Đối Cmdlets biên soạn, bạn có thể lấy đường dẫn đến .dll với:

(Get-Command Get-ChildItem).DLL 

(Thay thế Get-ChildItem với cmdlet bạn quan tâm)

Một khi bạn biết đường dẫn đến .dll, bạn có thể mở bằng trình tách rời .NET như dotPeek:

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

The source for Powershell is now available on Github.
Nguồn cho Get-ChildItem có thể được tìm thấy here.

+0

Điều gì sẽ xảy ra khi câu trả lời của câu hỏi thay đổi từ "không" thành "có"? –

+0

@GeekyI Có lẽ OP (poster gốc) phải chấp nhận câu trả lời mới, thay vì câu trả lời được chấp nhận trước đó. Nhưng OP chưa bao giờ chấp nhận một câu trả lời nào, cũng như anh ta không có một hồ sơ tích cực, vì vậy tôi cho rằng nó không quan trọng nhiều. –

+0

Tôi đồng ý, tôi nghĩ chấp nhận câu trả lời này. –

Các vấn đề liên quan