azukipochette's weblog

memory dump (mini)

PowerShell コマンドの実装を調べる方法

f:id:AzukiPochette:20200316003656j:plain unsplash-logoMarkus Spiske

PowerShell コマンドは、以下の 3 種類に分類される。

  • エイリアス (Alias)
  • 関数 (Function)
  • コマンドレット (Cmdlet)

本記事では、それぞれの実装の調査方法を説明する。

エイリアス (Alias) を調べる

PowerShell にはエイリアス (alias) と呼ばれる短縮コマンドが用意されている。
たとえば "cd"、"dir" や "rm" といったコマンドプロンプト風のコマンドは、このエイリアスで実現されている。

エイリアスの一覧を取得するには、以下のコマンドを実行する。

Get-Alias

特定のエイリアスがどのコマンドに割り当てられているのかを知るには、以下のようにコマンドを実行する。

Get-Alias <alias>
# (例) Get-Alias ls

関数 (Function) を調べる

PowerShell の関数は PowerShell で実装されており、次のコマンドで実装内容を確認できる。

(Get-Command <function>).Definition
# (例) (Get-Command Update-Script).Definition

コマンドレット (Cmdlet) を調べる

PowerShell のコマンドレットは、.NET Framework で実装されている。
このため、まずはどの DLL ファイルに、どのような完全名で実装されているのかを確認する必要がある。

コマンドレットの詳細を取得するには、以下のコマンドを実行する。

Get-Command <Cmdlet> | Format-List *
# (例) Get-Command Get-WinSystemLocale | Format-List *

出力例として "Get-WinSystemLocale" の例を示す。

HelpUri             : https://go.microsoft.com/fwlink/?LinkID=242247
DLL                 : C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.InternationalSettings.Commands\v4.0_3.0.0.0_
                      _31bf3856ad364e35\Microsoft.InternationalSettings.Commands.dll
Verb                : Get
Noun                : WinSystemLocale
HelpFile            : Microsoft.InternationalSettings.Commands.dll-Help.xml
PSSnapIn            :
Version             : 2.0.0.0
ImplementingType    : Microsoft.InternationalSettings.Commands.GetWinSystemLocaleCommand
Definition          :
                      Get-WinSystemLocale [<CommonParameters>]

DefaultParameterSet :
OutputType          : {}
Options             : ReadOnly
Name                : Get-WinSystemLocale
CommandType         : Cmdlet
Source              : International
Visibility          : Public
ModuleName          : International
Module              : International
RemotingCapability  : PowerShell
Parameters          : {[Verbose, System.Management.Automation.ParameterMetadata], [Debug,
                      System.Management.Automation.ParameterMetadata], [ErrorAction,
                      System.Management.Automation.ParameterMetadata], [WarningAction,
                      System.Management.Automation.ParameterMetadata]...}
ParameterSets       : {[<CommonParameters>]}

注目するべきは、DLLImplementingType の 2 つ。
これにより、どこ (DLL が示すパス) に、どのような完全名 (ImplementingType) で実装されているのかが分かる。

.NET デコンパイラを使う

DLL ファイル内の実装を調べるには .NET デコンパイラと呼ばれるツールを使用する必要がある。
.NET デコンパイラについては、著名なツールを別の記事でまとめているので、そちらを参照してほしい。

azukipochette.hatenablog.com