PowerShellについて学習しています。 Get-ChildItem のような組み込みコマンドレットのソースコードを表示することは可能ですか?
実際、最善の策は、チェックアウトすることです PowerShell Community Extensions 。このオープンソースソフトウェアコミュニティプロジェクトは、「広く役立つ一連の追加コマンドレットを提供することを目的としています...」。プロジェクトの開発者はPowerShellMVPであり、彼らのことを知っています。
既存のPowerShellコマンドレットでリフレクションを使用する限り、PowerShell MVP Oisin Grehanは、「 Reflect-Cmdlet "」というタイトルの便利な関数を作成しました。彼のコードを盗んでここに配置することはしませんが、基本的には次のようにします。
Get-Command Get-ChildItem | Reflect-Cmdlet
そして 。NET Reflector がポップアップし、右側のアセンブリが開いて展開され、すべてが表示されます。本当にかっこいいです。これがスクリーンショットです:
PowershellのソースがGithubで利用できるようになりました。Get-ChildItem
のソースは ここ にあります。
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を置き換えるコマンドレットを入力します。あなたがそれについてもっとグーグルしたいなら、これはあなたがプロキシ関数を作成する方法です。
コンパイルされたコマンドレットの場合、次のコマンドで.dll
へのパスを取得できます。
(Get-Command Get-ChildItem).DLL
(Get-ChildItem
を目的のコマンドレットに置き換えます)
.dll
へのパスがわかれば、 dotPeek :のような.NET逆アセンブラで開くことができます。
& dotPeek64.exe (Get-Command Get-ChildItem).DLL
PowerShellのソースコードがリリースされたことはないと思います。
。NET Reflector を使用してソースコードを「見る」ことができるはずです。ただし、アセンブリを知っている必要がありますが、GetTypeメソッドなどを使用してアクセスする必要もあります。
これ PowerShellLanguage .NETリフレクターアドイン はおそらく便利です。
CodePlexの WindowsインストーラーPowerShellスナップイン もご覧ください。これはコミュニティ拡張機能よりも小さなプロジェクトであるため、何が起こっているのかを簡単に把握できます。
Professional Windows PowerShell Programming:Snapins、Cmdlets、Hosts and Providers(Wrox Professional Guides)、ISBN:0470173939-これは私が最も役立つ本の1つです。コマンドレットとプロバイダーを作成するために見つかりました。
PowerShellコマンドレットのアセンブリはGACにあります。 「Get-ChildItem」コマンドレットは次の場所にあります。
Microsoft.PowerShell.Commands.Managementアセンブリ、Microsoft.PowerShell.Commands.GetChildItemCommandクラス。
ILSpy .NET逆コンパイラーを使用し、「powershell」文字列でGACアセンブリをフィルター処理しました。私が理解しているように、Microsoft.PowerShell.Commands。*アセンブリには組み込みのコマンドレットが含まれています。
一部のコードは、リファレンスリソースサイトにあります。 http://referencesource.Microsoft.com/#System.Management.Automation/System/Management/Automation/ChildItemCmdletProviderIntrinsics.cs,c6eed9f6a5417c19
ただし、これは概要を示すだけです。コードの詳細ではありません。