【PowerShell】コマンドの実行ファイルはどこ?`Get-Command`で探す

はい、承知いたしました。PowerShellのGet-Commandコマンドレットに焦点を当て、「PowerShellコマンドの実行ファイルはどこ?Get-Commandで探す」というテーマで、詳細な説明を含む約5000語の記事を作成します。記事の形式で直接ここに表示します。


PowerShellコマンドの実行ファイルはどこ?Get-Commandで探す

はじめに:PowerShellコマンドの多様性と「実行ファイル」の問い

PowerShellは、Windowsシステム管理の中心的なツールとして広く利用されています。コマンドライン操作、スクリプト作成、自動化など、その用途は多岐にわたります。PowerShellで私たちが日常的に使用する「コマンド」は、一見するとただの文字列ですが、その背後には様々な種類の実体が存在します。

例えば、ファイルやディレクトリの一覧を表示する際にGet-ChildItemを使ったり、プロセス情報を取得する際にGet-Processを使ったりします。また、コマンドプロンプトやBashに慣れている方なら、dirlspsといったコマンドを入力することもあるでしょう。さらに、notepad.exeのようなWindowsの標準アプリケーションをPowerShellから直接起動することも珍しくありません。

これらの「コマンド」は、コンピューター上のどこかにその実体、いわゆる「実行ファイル」やそれに相当するものが存在しています。しかし、その場所はコマンドの種類によって大きく異なります。

  • notepad.exeのような従来のアプリケーションは、.exeファイルとして特定のフォルダ(例: C:\Windows\System32)に存在します。
  • Get-ProcessのようなPowerShell独自のコマンドレットは、.dllファイルのような形でシステムのどこかに格納されているモジュールの一部として提供されます。
  • 自作のPowerShellスクリプトファイル(.ps1)を実行する場合、その.ps1ファイル自体が「実行ファイル」と言えます。
  • そして、dirlsのようなコマンドは、実際には別のコマンドレット(Get-ChildItemなど)への「別名」、すなわちエイリアスです。

このように、PowerShellで扱う「コマンド」は、その種類によって実体の場所や形式が異なります。「あのコマンドはどこにあるんだろう?」「このコマンドは具体的に何を実行しているんだろう?」といった疑問を持ったとき、それを解決するための最も基本的な、そして最も強力なツールが、今回詳しく解説するGet-Commandコマンドレットです。

この記事では、Get-Commandを徹底的に解説し、PowerShellコマンドの様々な種類と、それぞれの実体(「実行ファイル」にあたるもの)がどこにあるのかを特定する方法を学びます。Get-Commandの基本的な使い方から、便利なパラメータ、そして得られる情報から実行ファイルの場所を特定する具体的な手順までを、豊富な実行例とともに詳細に見ていきましょう。

Get-Commandコマンドレットの基本

Get-Commandとは?

Get-Commandコマンドレットは、その名前が示す通り、PowerShell環境で利用可能なコマンドを取得するためのツールです。PowerShellセッションで現在利用可能なコマンド(コマンドレット、関数、スクリプト、エイリアス、外部実行ファイルなど)を検索し、その情報を表示します。

Get-Commandは非常に汎用性が高く、特定のコマンドが存在するかどうかを確認したり、コマンドの種類や定義元を調べたり、利用可能な全てのコマンドの一覧を取得したりと、様々な目的に使用できます。

基本的な使い方

引数を何も指定せずにGet-Commandを実行すると、現在のPowerShellセッションで利用可能な全てのコマンドの一覧が表示されます。環境によっては非常に多くのコマンドが表示されるため、全てを見るのは現実的ではないかもしれません。

powershell
Get-Command

このコマンドを実行すると、以下のような情報を含むリストが表示されます(表示内容は環境によって異なります)。

CommandType Name Version Source
----------- ---- ------- ------
Alias % -> ForEach-Object
Alias ? -> Where-Object
Alias ac -> Add-Content
Alias asnp -> Add-PSSnapin
...
Cmdlet Add-AppxPackage 1.0.0.0 Appx
Cmdlet Add-Computer 3.1.0.0 Microsoft.PowerShell.Management
...
Function Confirm-SecureBootUEFI
Function ConvertFrom-SecureString
...
Application agent.exe
Application bash.exe
Application bginfo.exe
...

表示される各行は一つのコマンドを表しており、重要な情報として以下の列が含まれています。

  • CommandType: コマンドの種類を示します。これこそが、コマンドの実体が何であるか、そして「実行ファイル」にあたるものがどこにあるのかを特定する上で最も重要な情報です。
  • Name: コマンドの名前です。
  • Version: コマンドレットやアプリケーションの場合にバージョンが表示されることがあります。
  • Source: コマンドの定義元を示します。コマンドの種類によって、これがモジュール名だったり、スクリプトファイルのパスだったり、アプリケーション名だったりします。

特定のコマンドについて調べたい場合は、Get-Commandの後にコマンド名を指定します。例えば、Get-Processコマンドについて調べたい場合:

powershell
Get-Command Get-Process

出力例:

CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-Process 3.1.0.0 Microsoft.PowerShell.Management

この出力から、Get-ProcessCmdlet(コマンドレット)であり、Microsoft.PowerShell.Managementというソース(この場合はモジュール名)に由来することが分かります。

次に、notepad.exeのような外部コマンドについて調べてみましょう。

powershell
Get-Command notepad.exe

出力例:

CommandType Name Version Source
----------- ---- ------- ------
Application notepad.exe 10.0.19041.3636 C:\WINDOWS\system32\notepad.exe

この出力から、notepad.exeApplication(アプリケーション、つまり外部実行ファイル)であり、そのSourceプロパティがC:\WINDOWS\system32\notepad.exeというフルパスを示していることが分かります。これが、notepad.exeというコマンドの「実行ファイル」の場所です。

このように、Get-Commandを使うと、コマンド名からその種類と定義元(多くの場合、実体の場所やヒント)を知ることができます。特にCommandTypeSourceプロパティは、コマンドの実体がどこにあるのかを突き止めるための鍵となります。

Get-Commandで探せるコマンドの種類と実行ファイルの場所

Get-Commandで表示されるCommandTypeは、PowerShellが認識しているコマンドの主な種類を示します。それぞれの種類によって、「実行ファイル」という概念の解釈や、その実体の場所を特定する方法が異なります。主要なCommandTypeについて詳しく見ていきましょう。

1. Cmdlet (コマンドレット)

  • 定義: コマンドレット(Cmdlet)は、PowerShell環境のネイティブなコマンドです。通常、.NET Frameworkや.NET Core/.NET 5+で実装され、PowerShellの内部APIと連携するように設計されています。Cmdletは、Verb-Noun(動詞-名詞)の命名規則に従うのが一般的です(例: Get-Process, Set-Location, Restart-Computer)。
  • 特徴: Cmdletは、外部プロセスを起動するのではなく、PowerShellプロセス内で直接実行されます。そのため、通常は外部実行ファイル(.exeなど)として単独で存在するわけではありません。Cmdletは、関連する機能ごとにモジュール(Module)としてパッケージ化されており、そのモジュールをインポートすることで利用可能になります。Cmdletの実体は、多くの場合モジュール内の.dllファイルにC#などのコードとしてコンパイルされて格納されています。
  • Get-Commandでの出力:
    • CommandTypeCmdletと表示されます。
    • Sourceプロパティには、そのCmdletが含まれている「モジュール名」が表示されます。これはCmdlet自体のファイルパスではありません。
  • 実行ファイルの場所: Cmdlet自体は単独の実行ファイルではありません。実体はそれを定義するモジュールに含まれる.dllファイル内にあります。その.dllファイルの場所を知るには、Sourceプロパティに表示されたモジュール名を手がかりにします。

    1. まず、Get-Command <コマンド名>CommandTypeCmdletであることを確認し、Source(モジュール名)を特定します。
      powershell
      Get-Command Get-Process
      # 出力例: Source は Microsoft.PowerShell.Management
    2. 次に、Get-Moduleコマンドレットを使って、そのモジュールに関する詳細情報を取得します。特に-Nameパラメータでモジュール名を指定します。
      powershell
      Get-Module -Name Microsoft.PowerShell.Management
    3. Get-Moduleの出力には、モジュールの様々な情報が表示されますが、その中にPathプロパティがあります。これがモジュールのファイルパスです。多くのCmdletモジュールは.psd1(マニフェストファイル)や.psm1(スクリプトモジュール)、または.dllファイルとして提供されます。Cmdletの実装コードは通常、このパスにある.dllファイル内にあります。
      powershell
      Get-Module -Name Microsoft.PowerShell.Management | Select-Object Path
      # 出力例: C:\WINDOWS\System32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Management\Microsoft.PowerShell.Management.psd1

      モジュールパスが.psd1の場合、そのマニフェストファイルを開くと、RootModuleNestedModulesなどの項目で実際のコードが含まれる.dllファイル(または.psm1スクリプトファイル)が指定されていることが多いです。最終的なCmdletの実装コードは、その.dllファイル(または.psm1)内にコンパイルされた形で存在します。

    したがって、Cmdletの「実行ファイル」にあたるものは、モジュール内の特定の.dllファイルであり、その場所はGet-Moduleの出力するPathプロパティから特定できます。

2. Function (関数)

  • 定義: 関数は、PowerShellスクリプト言語で記述されたコマンドのブロックです。ユーザー自身が定義することも、モジュールによって提供されることもあります。Cmdletと同様に、PowerShellプロセス内で実行されますが、通常はコンパイルされたコードではなく、PowerShellスクリプトとして定義されます。
  • 特徴: 関数は柔軟性が高く、短い処理から複雑な処理までをまとめるのに適しています。PowerShellのスクリプトファイル(.ps1)や、プロファイルスクリプト(Microsoft.PowerShell_profile.ps1など)内で定義できます。モジュールとして配布される関数もあります。
  • Get-Commandでの出力:
    • CommandTypeFunctionと表示されます。
    • Sourceプロパティには、その関数が定義されているスクリプトファイル名、モジュール名、またはセッションの一時的な定義元が表示されます。
  • 実行ファイルの場所: 関数自体に「実行ファイル」という概念は直接的にはありません。実体は、関数が定義されているスクリプトコードです。

    1. Get-Command <関数名>を実行し、CommandTypeFunctionであることを確認します。
    2. Sourceプロパティを確認します。
      • Sourceがスクリプトファイルのパス(例: C:\Scripts\MyFunctions.ps1)であれば、そのファイル内に定義されています。このファイルが関数の「実行ファイル」にあたるソースコードの場所です。
        “`powershell

      例: スクリプトファイル内で関数を定義し、その場所を調べる

      ファイル: C:\Temp\MyFunctions.ps1

      —————

      function Get-HelloWorld { “Hello, World!” }

      —————

      PowerShellコンソールで実行:

      . C:\Temp\MyFunctions.ps1 # 関数をセッションに読み込む (. dot sourcing)
      Get-Command Get-HelloWorld

      出力例: Source は C:\Temp\MyFunctions.ps1

      * `Source`がモジュール名であれば(Cmdletと同様)、その関数はモジュール内で定義されています。そのモジュールの場所は`Get-Module -Name <モジュール名> | Select-Object Path`で確認できます。モジュールの実体(`.psm1`スクリプトファイルや`.dll`ファイル)内に、関数のスクリプトコードまたはコンパイルされた定義が含まれています。powershell

      例: モジュール内の関数 (例として Get-NetAdapter)

      Get-Command Get-NetAdapter

      出力例: Source は NetAdapter

      Get-Module -Name NetAdapter | Select-Object Path

      出力例: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\NetAdapter\NetAdapter.psd1

      NetAdapter.psd1 ファイル内に、関数定義を含む .psm1 や .dll への参照がある

      ``
      *
      Sourceが空白やセッション固有の名前(例:__DynamicModule_…)の場合は、その関数が現在のPowerShellセッション内で直接定義されたもの(例: コマンドラインで直接定義、またはプロファイルスクリプトによる定義)であることを示します。この場合、永続的なファイルとしての「実行ファイル」は存在しないか、プロファイルスクリプト内に記述されています。プロファイルスクリプトの場所は$PROFILE`変数で確認できます。

    関数の「実行ファイル」にあたるものは、それを定義しているソースコードであり、その場所はSourceプロパティから特定できるスクリプトファイルまたはモジュールの実体となります。

3. Script (スクリプト)

  • 定義: スクリプト(Script)は、PowerShellスクリプトファイル(.ps1拡張子を持つファイル)そのものです。このファイルをコマンドとして直接実行できます(ただし、実行ポリシーの設定によります)。
  • 特徴: PowerShellスクリプトは、一連のPowerShellコマンドやロジックを記述したテキストファイルです。関数定義を含めることも、単にコマンドを順次実行するだけのものもあります。
  • Get-Commandでの出力:
    • CommandTypeScriptと表示されます。
    • Sourceプロパティには、そのスクリプトファイルの「フルパス」が表示されます。
  • 実行ファイルの場所: スクリプトファイルの場合、Sourceプロパティに表示されるフルパスそのものが「実行ファイル」の場所です。これが最も分かりやすいケースです。
    powershell
    # 例: C:\Scripts\MyScript.ps1 というファイルがあるとして
    # ---------------
    # Write-Host "This is a script."
    # ---------------
    Get-Command C:\Scripts\MyScript.ps1 # フルパスを指定
    # または、環境変数 PATH にスクリプトのディレクトリが含まれている場合
    # Get-Command MyScript.ps1
    # 出力例: CommandType は Script, Source は C:\Scripts\MyScript.ps1

    Get-Commandは、環境変数PATHに含まれるディレクトリや、現在のディレクトリなどを検索してスクリプトファイルを見つけます。見つかった場合、そのファイルのフルパスをSourceプロパティとして表示します。

    スクリプトの「実行ファイル」は、Sourceプロパティが示す.ps1ファイルそのものです。

4. Alias (エイリアス)

  • 定義: エイリアス(Alias)は、既存のコマンド(Cmdlet, Function, Script, Applicationなど)に付けられた「別名」です。よく使う長いコマンド名を短くしたり、他のシェルのコマンド名(例: dirlscd)に合わせたりするために使用されます。
  • 特徴: エイリアス自体はコマンドではありません。単なる名前のマッピングです。エイリアスを実行すると、実際にはそのエイリアスが指し示している元のコマンドが実行されます。
  • Get-Commandでの出力:
    • CommandTypeAliasと表示されます。
    • Sourceプロパティは通常空白です。
    • 重要なのはDefinitionプロパティです。このプロパティに、そのエイリアスが指し示している「元のコマンド名」が表示されます。
  • 実行ファイルの場所: エイリアス自体には実行ファイルはありません。実行ファイルの場所を知るには、Definitionプロパティが示す元のコマンドについて再度Get-Commandで調べる必要があります。

    1. Get-Command <エイリアス名>を実行し、CommandTypeAliasであることを確認します。
    2. Definitionプロパティを確認します。
      powershell
      Get-Command dir
      # 出力例: CommandType は Alias, Definition は Get-ChildItem
    3. Definitionプロパティに表示されたコマンド名を引数として、再度Get-Commandを実行します。
      powershell
      Get-Command Get-ChildItem
      # 出力例: CommandType は Cmdlet, Source は Microsoft.PowerShell.Management
    4. 元のコマンドのCommandTypeSourceプロパティを見て、上記で説明した各タイプの方法で実行ファイルの場所を特定します。この例では、dirエイリアスはGet-ChildItemコマンドレットを指しており、その実体はMicrosoft.PowerShell.Managementモジュールに含まれるDLL内にあることが分かります。

    エイリアスの「実行ファイル」は、そのエイリアスが指す元のコマンドの実体です。Get-Commandを再帰的に使うことでその場所を特定できます。

5. Application (アプリケーション)

  • 定義: アプリケーション(Application)は、PowerShellの外部で実行されるプログラムです。Windowsの実行可能ファイル(.exe)、バッチファイル(.bat, .cmd)、スクリプトファイル(.vbs, .js, .ps1など)、その他の実行可能なファイル形式(.comなど)が含まれます。これらは、PowerShellプロセスとは独立したプロセスとして実行されます。
  • 特徴: これらはPowerShell固有のコマンドではなく、オペレーティングシステムが直接実行できるプログラムです。PowerShellからこれらのプログラムをコマンド名だけで実行できるのは、Windowsの環境変数PATHにそのプログラムが格納されているディレクトリが含まれているためです。Get-Commandは、PATH環境変数に設定されているディレクトリを検索して、対応するファイルを見つけます。
  • Get-Commandでの出力:
    • CommandTypeApplicationと表示されます。
    • Sourceプロパティには、その実行可能ファイルの「フルパス」が表示されます。
  • 実行ファイルの場所: アプリケーションの場合、Sourceプロパティに表示されるフルパスそのものが、クラシックな意味での「実行ファイル」の場所です。
    “`powershell
    Get-Command notepad.exe
    # 出力例: CommandType は Application, Source は C:\WINDOWS\system32\notepad.exe

    Get-Command ipconfig

    出力例: CommandType は Application, Source は C:\WINDOWS\System32\ipconfig.exe

    ``Get-Commandは、環境変数PATHに含まれるディレクトリを順番に検索し、指定された名前(またはPATHExt環境変数で定義された拡張子を持つファイル)に一致する最初のファイルを見つけます。見つかったファイルのフルパスがSource`として表示されます。

    アプリケーションの「実行ファイル」は、Sourceプロパティが示すファイルそのものです。

その他のCommandType

  • Filter: 関数の一種ですが、パイプライン処理に特化した構造を持ちます。基本的な考え方や場所の特定方法はFunctionと同様です。
  • Configuration: Desired State Configuration (DSC) に関連するものです。これもFunctionやScriptと同様に、定義されているソースコードファイルやモジュールが実体となります。

Get-Commandは、これらの主要なコマンドタイプを識別し、その情報を提供することで、コマンドの実体がどこにあるのか、またはどうすればその実体を見つけられるのかの強力な手がかりを与えてくれます。

Get-Commandの便利なパラメータ

Get-Commandは多くのパラメータを持っており、これらを活用することで、より効率的に目的のコマンドを検索したり、詳細情報を取得したりできます。

-CommandType <CommandType[]>

指定した種類のコマンドのみを検索します。複数の種類を指定することも可能です。特定のタイプのコマンドだけを探したい場合に非常に便利です。

“`powershell

コマンドレットのみを検索

Get-Command -CommandType Cmdlet

アプリケーション(外部実行ファイル)のみを検索

Get-Command -CommandType Application

関数とエイリアスの両方を検索

Get-Command -CommandType Function, Alias

指定した名前のコマンドがどのタイプか知りたい場合にも使える(引数指定なしで)

Get-Command -Name dir -CommandType Alias # dir は Alias か? -> Yes/No
Get-Command -Name dir -CommandType Cmdlet # dir は Cmdlet か? -> No
Get-Command -Name Get-ChildItem -CommandType Cmdlet # Get-ChildItem は Cmdlet か? -> Yes
“`

-Name <String[]>

検索したいコマンド名を指定します。ワイルドカード(*?)を使用することで、パターンに一致する複数のコマンドを一度に検索できます。

“`powershell

“Process”を含む名前のコマンドを検索

Get-Command -Name Process

“Get-“で始まるコマンドレットを検索

Get-Command -Name Get-* -CommandType Cmdlet

“Item”で終わるコマンド(全てのタイプ)を検索

Get-Command -Name *Item
“`

-Module <String[]>

特定のモジュールに含まれるコマンドを検索します。モジュールの内容を確認したい場合に役立ちます。

“`powershell

Microsoft.PowerShell.Management モジュールに含まれるコマンドを検索

Get-Command -Module Microsoft.PowerShell.Management

Storage モジュールに含まれるコマンドレットを検索

Get-Command -Module Storage -CommandType Cmdlet
“`

-Noun <String[]>, -Verb <String[]>

Cmdlet名のVerb-Noun構造を利用して、動詞や名詞でコマンドレットを検索します。Cmdletを探す場合に特化したパラメータです。

“`powershell

“Get”という動詞を持つコマンドレットを検索

Get-Command -Verb Get

“Service”という名詞を持つコマンドレットを検索

Get-Command -Noun Service

“Get”という動詞と”Service”という名詞を持つコマンドレットを検索 (Get-Service)

Get-Command -Verb Get -Noun Service
``-Verbパラメータは、Get-Verb`コマンドレットで取得できる標準的なPowerShell動詞のリストと照らし合わせて検索します。

-Syntax

指定したコマンドの構文(パラメータの使い方など)を表示します。コマンドの詳しい使い方を知りたい場合に便利です。Get-Help <コマンド名> -Syntaxとほぼ同じですが、Get-Commandでも確認できます。

powershell
Get-Command Get-Process -Syntax

出力例:

“`
Get-Process [[-Name] ] [-Module] [-FileVersionInfo] [-ErrorAction ] [-ErrorVariable ] [-OutBuffer ] [-OutVariable ] [-PipelineVariable ] [-Verbose] [-WarningAction ] [-WarningVariable ] [-InformationAction ] [-InformationVariable ] []

Get-Process [-Id] [-Module] [-FileVersionInfo] [-ErrorAction ] [-ErrorVariable ] [-OutBuffer ] [-OutVariable ] [-PipelineVariable ] [-Verbose] [-WarningAction ] [-WarningVariable ] [-InformationAction ] [-InformationVariable ] []

Get-Process [-InputObject] [-Module] [-FileVersionInfo] [-ErrorAction ] [-ErrorVariable ] [-OutBuffer ] [-OutVariable ] [-PipelineVariable ] [-Verbose] [-WarningAction ] [-WarningVariable ] [-InformationAction ] [-InformationVariable ] []
“`

-TotalCount <Int32>

検索結果の数を指定した数に制限します。多数のコマンドが見つかる場合に、最初の数件だけを確認したいときに便利です。

“`powershell

最初の10個のコマンドを表示

Get-Command -TotalCount 10
“`

-All

通常、Get-Command <コマンド名>は、PowerShellが実行時に優先的に選択するコマンドのみを表示します。しかし、環境変数PATHに同じ名前の実行ファイルが複数存在する場合など、同名のコマンドが複数定義されていることがあります。-Allパラメータを使うと、優先順位に関わらず、見つかった同名のコマンド全てを表示します。これは、意図しないコマンドが実行されている可能性がある場合などのトラブルシューティングに役立ちます。

“`powershell

通常の Get-Command ipconfig

Get-Command ipconfig

出力例: C:\WINDOWS\System32\ipconfig.exe

同名のコマンドが複数ある可能性を探る (例: 別のディレクトリに同名ファイルがある場合など)

Get-Command ipconfig -All

複数のパスが出力される可能性あり

``
特に
Applicationタイプの場合、$env:PATHに同じ実行ファイル名を含むディレクトリが複数ある場合に、-Allを使うと複数のエントリが表示されることがあります。PowerShellは、PATH`に記載された順序で最初に見つかったものを実行します。

-ParameterType <Type[]>, -ArgumentList <Object[]>

これらのパラメータはより高度な検索に使用します。

  • -ParameterType: 指定した型のパラメータを持つコマンドレットや関数を検索します。
  • -ArgumentList: 指定した引数で呼び出されたときに成功するコマンドレットや関数を検索します(動的なパラメータを持つコマンドレットの検索に役立ちます)。

これらのパラメータを使うことで、特定のデータ型を扱うコマンドや、特定のシナリオで使用できるコマンドを探すことが可能です。

これらのパラメータを組み合わせることで、PowerShell環境内のコマンドを柔軟かつ詳細に探索し、「実行ファイル」やその実体への道のりを効率的に見つけることができます。

複数のコマンドタイプ、同名コマンドの優先順位

PowerShellは、ユーザーがコマンド名を入力してEnterキーを押したときに、どのコマンドを実行するかを特定の順序で決定します。この検索順序は、同名のコマンドが複数の異なるタイプや場所で定義されている場合に重要になります。

PowerShellのコマンド検索順序は以下の通りです(優先度が高い順):

  1. Alias (エイリアス)
  2. Function (関数)
  3. Cmdlet (コマンドレット)
  4. External Script (外部スクリプト) (.ps1ファイルなど)
  5. Application (アプリケーション) (.exe, .com, .bat, .cmdなど)

例えば、Get-ChildItemというCmdletが存在し、これに対してdirというエイリアスが定義されている場合、dirと入力するとエイリアスが優先され、最終的にGet-ChildItemCmdletが実行されます。もし、カレントディレクトリにdir.ps1というスクリプトファイルがあったとしても、エイリアスやCmdletより優先順位が低いため、通常はdirと入力してもこのスクリプトは実行されません。(ただし、.ps1の場合は ./dir.ps1のように明示的にパスを指定すれば実行できます。)

Applicationの場合、PowerShellは環境変数PATHにリストされているディレクトリを順番に検索します。また、PATHExt環境変数には、検索対象となるファイル拡張子(.exe, .com, .bat, .cmd, .ps1など)が定義されています。Get-Commandやコマンド実行時には、PATH内のディレクトリとPATHExt内の拡張子を組み合わせてファイルを検索します。PATHの中で最初に見つかった、指定されたコマンド名に対応するファイルが実行されます。

Get-Command -Allでの確認

前述のように、Get-Command -Allを使用すると、PowerShellが認識している同名のコマンド全てを表示できます。これにより、検索順序において通常は隠されてしまう、優先順位の低い同名コマンドの存在を確認できます。

“`powershell

例えば、カレントディレクトリに test.exe と test.ps1 があり、

C:\SomewhereInPATH に test.exe の別のバージョンがあると仮定

$env:PATH にはカレントディレクトリ (.) は含まれていないとする

$env:PATH = “C:\SomewhereInPATH;C:\WINDOWS\System32;…”

Get-Command test -All

出力例:

CommandType Name Version Source

———– —- ——- ——

Application test.exe 1.0 C:\SomewhereInPATH\test.exe <- PATHで最初に見つかったもの

Application test.exe 2.0 C:\Current\Directory\test.exe <- カレントディレクトリの同名ファイル

Script test.ps1 C:\Current\Directory\test.ps1 <- カレントディレクトリの同名スクリプト

“`

この例では、testという名前で検索した際に、Get-Command -Allが3つのエントリを見つけたとします。PowerShellが単にtestと入力された場合に実行するのは、PATH変数で最初に見つかったC:\SomewhereInPATH\test.exeです。

特定のコマンドを実行したい場合は、以下の方法があります。

  • 優先されるコマンドを実行: コマンド名だけを入力します。
  • 特定のコマンドを実行:
    • フルパスを指定して実行します(例: C:\Current\Directory\test.exe, C:\Current\Directory\test.ps1)。
    • カレントディレクトリのスクリプトを実行する場合は、.\を付けてパスを明示します(例: .\test.ps1)。
    • Get-Command -Allで取得したリストから目的のコマンドオブジェクトを選択し、そのオブジェクトを呼び出すことも技術的には可能です(例: (Get-Command test -All | Where-Object { $_.Source -eq "C:\Current\Directory\test.exe" }) | Invoke-Command のように)。

Get-Command -Allは、PowerShellがどのようにコマンドを解決しているのかを理解し、期待するコマンドが実行されているかを確認するための重要なツールです。

実行ファイルの場所を特定する具体的なステップ

これまでの説明を踏まえ、特定のPowerShellコマンドの「実行ファイル」にあたるものがどこにあるのかを特定するための具体的なステップをまとめましょう。

知りたいコマンドの名前がMyCommandであるとします。

ステップ1: Get-Commandを実行して、コマンドの種類と定義元を確認する

まず、知りたいコマンド名を引数にしてGet-Commandを実行します。

powershell
Get-Command MyCommand

出力結果のCommandTypeSourceプロパティを確認します。

ステップ2: CommandTypeに応じた場所特定方法を適用する

Get-Commandの出力で確認したCommandTypeに基づいて、以下のいずれかの方法で実体の場所を特定します。

  • CommandTypeApplicationの場合:

    • Sourceプロパティに表示されているパスが、その実行ファイル(.exe, .bat, .cmdなど)のフルパスです。これが「実行ファイル」の場所です。
    • 例: Get-Command notepad.exe -> SourceC:\WINDOWS\system32\notepad.exe。これが場所。
  • CommandTypeScriptの場合:

    • Sourceプロパティに表示されているパスが、そのPowerShellスクリプトファイル(.ps1)のフルパスです。これが「実行ファイル」の場所です。
    • 例: Get-Command C:\Scripts\MyScript.ps1 -> SourceC:\Scripts\MyScript.ps1。これが場所。
  • CommandTypeCmdletの場合:

    • Sourceプロパティに表示されているのはモジュール名です。Cmdletの実体は、このモジュールに含まれるDLLファイル内にあります。
    • モジュール名(例: MyModule)を引数にしてGet-Moduleを実行し、Pathプロパティを確認します。
      powershell
      Get-Module -Name MyModule | Select-Object Path
    • 表示されたPathが、モジュールの場所です。多くの場合、.psd1ファイルや.psm1ファイル、または直接.dllファイルが示されます。Cmdletの実体は、このパスにあるモジュールファイル(通常は.dllまたは.psm1)内に含まれています。
    • 例: Get-Command Get-Process -> SourceMicrosoft.PowerShell.ManagementGet-Module -Name Microsoft.PowerShell.Management | Select-Object Path -> パスが表示され、その中の.dllファイルなどにCmdletの実体がある。
  • CommandTypeFunctionまたはFilterの場合:

    • Sourceプロパティを確認します。
      • Sourceがスクリプトファイルのパスであれば、そのファイル内に定義されています。そのファイルが実体の場所です。
      • Sourceがモジュール名であれば、Cmdletと同様にGet-Moduleでモジュールの場所(.psm1.dllなど)を調べます。関数はそのモジュールファイル内に定義されています。
      • Sourceが空白またはセッション固有の名前であれば、その関数は現在のセッション内で直接定義されています(例: プロファイルスクリプトやコマンドライン)。プロファイルスクリプトに定義されている場合は、$PROFILE変数の示すファイルを確認します。
    • 例: Get-Command Get-HelloWorld (自作関数) -> SourceC:\Temp\MyFunctions.ps1。これが場所。
    • 例: Get-Command Get-NetAdapter -> SourceNetAdapterGet-Module -Name NetAdapter | Select-Object Pathでモジュールの場所を確認。
  • CommandTypeAliasの場合:

    • エイリアス自体に実行ファイルはありません。Definitionプロパティが指し示している元のコマンド名を調べます。
    • Definitionプロパティに表示されたコマンド名(例: OriginalCommand)を引数にして、再度Get-Commandを実行します。
      powershell
      Get-Command OriginalCommand
    • 再実行したGet-Commandの出力に基づいて、上記いずれかの方法でOriginalCommandの実体の場所を特定します。
    • 例: Get-Command dir -> DefinitionGet-ChildItemGet-Command Get-ChildItemを実行し、Cmdletの場所特定方法に従う。

具体例で確認

いくつかのよく使うコマンドについて、このステップで場所を特定してみましょう。

  1. ipconfig:

    • Get-Command ipconfig
      CommandType Name Version Source
      ----------- ---- ------- ------
      Application ipconfig.exe 10.0.19041.1 C:\WINDOWS\System32\ipconfig.exe
    • CommandTypeApplicationSourceC:\WINDOWS\System32\ipconfig.exe
    • 場所: C:\WINDOWS\System32\ipconfig.exeファイルそのものが実行ファイル。
  2. Get-ComputerInfo:

    • Get-Command Get-ComputerInfo
      CommandType Name Version Source
      ----------- ---- ------- ------
      Cmdlet Get-ComputerInfo 1.0.0.0 Microsoft.PowerShell.Management
    • CommandTypeCmdletSourceMicrosoft.PowerShell.Managementモジュール。
    • Get-Module -Name Microsoft.PowerShell.Management | Select-Object Path
      Path
      ----
      C:\WINDOWS\System32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Management\Microsoft.PowerShell.Management.psd1
    • 場所: C:\WINDOWS\System32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Managementディレクトリ内のモジュールファイル(おそらく.psd1がマニフェストで、中にCmdlet実装のDLLへの参照がある)。Cmdletの実体はそのDLL内にある。
  3. cd:

    • Get-Command cd
      CommandType Name Version Source
      ----------- ---- ------- ------
      Alias cd -> Set-Location
    • CommandTypeAliasDefinitionSet-Location
    • Get-Command Set-Location
      CommandType Name Version Source
      ----------- ---- ------- ------
      Cmdlet Set-Location 3.1.0.0 Microsoft.PowerShell.Management
    • CommandTypeCmdletSourceMicrosoft.PowerShell.Managementモジュール。
    • 場所: cdSet-Locationコマンドレットへのエイリアス。Set-Location Cmdletの実体は、Microsoft.PowerShell.Managementモジュール内のDLLにある。場所は上記Get-ComputerInfoの例と同様の方法で特定できるモジュールパス。
  4. カレントディレクトリにあるMyScript.ps1: (カレントディレクトリをPATHに追加していない場合)

    • Get-Command MyScript.ps1 (カレントディレクトリをPATHに追加していないため見つからないか、別の場所の同名ファイルが見つかる可能性)
    • 正確に指定: Get-Command .\MyScript.ps1 (カレントディレクトリにあることを明示)
      CommandType Name Version Source
      ----------- ---- ------- ------
      Script MyScript.ps1 C:\Current\Directory\MyScript.ps1
    • CommandTypeScriptSourceC:\Current\Directory\MyScript.ps1
    • 場所: C:\Current\Directory\MyScript.ps1ファイルそのものが実行ファイル。

これらのステップを踏むことで、PowerShellコマンドの種類に応じた「実行ファイル」やその実体の場所を確実に特定することができます。

応用的な使い方とトラブルシューティング

Get-Commandとその出力情報は、コマンドの場所を特定するだけでなく、PowerShell環境に関する様々な応用的な調査やトラブルシューティングにも役立ちます。

特定のパスにある実行可能ファイルがPowerShellから実行できない場合

Get-Command <ファイル名>Applicationとして見つかるにも関わらず、コマンド名だけで実行できない場合があります。原因としては以下が考えられます。

  • 環境変数 PATH にそのディレクトリが含まれていない: Get-CommandPATHを検索します。PATHにない場所のファイルは、フルパスまたは相対パスで指定しないと実行できません。
    • $env:PATH を確認して、目的の実行ファイルがあるディレクトリが含まれているか調べましょう。
    • 必要であれば、セッション中に $env:PATH = "$env:PATH;C:\Path\To\Your\App" のように一時的にPATHに追加するか、システムの環境変数を変更します。
  • 実行ポリシーによりスクリプトの実行が制限されている: .ps1スクリプトの場合、PowerShellの実行ポリシーによって実行がブロックされている可能性があります。
    • Get-ExecutionPolicy で現在のポリシーを確認します。
    • 必要であれば、Set-ExecutionPolicy でポリシーを変更します(ただしセキュリティリスクを理解して行う必要があります)。
    • .ps1スクリプトをApplicationとして実行しようとしている場合、PATHExt変数に.PS1が含まれている必要があります。$env:PATHExt を確認してください。

Get-Commandで見つからないコマンド

Get-Command <コマンド名>を実行しても何も表示されない、または「コマンドが見つかりません」のようなエラーが出る場合、そのコマンドは現在のPowerShellセッションで利用可能になっていません。

考えられる原因と対処法:

  • コマンド名が間違っている: スペルミスがないか確認しましょう。Get-Command -Name *部分的な名前*のようにワイルドカードを使って検索してみるのも有効です。
  • コマンドが含まれるモジュールがインポートされていない: 特にCmdletやモジュール関数は、それらが含まれるモジュールがImport-Moduleなどで明示的に、または自動的にインポートされないと利用できません。
    • Get-Module -ListAvailableでシステムにインストールされている利用可能なモジュールを確認します。
    • 目的のコマンドが含まれていそうなモジュールが見つかったら、Import-Module <モジュール名>でインポートしてみます。その後、再度Get-Command <コマンド名>を試します。
  • コマンドを定義しているスクリプトファイルが実行されていない: 関数やエイリアスがスクリプトファイルやプロファイルスクリプトで定義されている場合、そのスクリプトが実行(dot sourcingなど)されていないと、定義はセッションに読み込まれません。
    • スクリプトファイルを実行します(例: . .\MyFunctions.ps1)。
    • プロファイルスクリプトに定義されている場合は、新しいPowerShellセッションを開始するか、. $PROFILEでプロファイルスクリプトを再読み込みします。
  • 外部実行ファイルが PATH にない: Applicationタイプの場合、実行ファイルがPATHに含まれるディレクトリにないか、フルパス指定で実行する必要があります。

PowerShellモジュールの発見とインストール

Get-CommandでCmdletやモジュール関数を探していて、目的のモジュールが見つからない(Get-Module -ListAvailableでも見つからない)場合は、そのモジュールがシステムにインストールされていない可能性があります。

  • Find-Module <モジュール名>コマンドレットを使って、PowerShell Galleryなどのリポジトリからモジュールを検索できます。
  • Install-Module <モジュール名>コマンドレットを使って、見つかったモジュールをシステムにインストールできます(管理者権限が必要な場合があります)。
    • インストール後、Import-Module <モジュール名>でセッションに読み込むことで、そのモジュールに含まれるコマンドが利用可能になり、Get-Commandでも見つかるようになります。

環境変数 PATHPATHExt の確認

Applicationタイプのコマンドの場所特定やトラブルシューティングには、環境変数PATHPATHExtの理解が不可欠です。

  • $env:PATH: 実行可能ファイルやスクリプトをコマンド名だけで検索する際に参照されるディレクトリのリストです。セミコロン;で区切られています。
    powershell
    $env:PATH -split ';' | Where-Object { $_ } # 改行して見やすく表示
  • $env:PATHExt: コマンド名に拡張子がない場合に、PowerShellがPATH内のディレクトリで検索する実行可能ファイル拡張子のリストです。セミコロン;で区切られています。通常、.EXE;.COM;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PS1;.PSM1などが含まれています。
    powershell
    $env:PATHExt -split ';'

    もし.ps1ファイルをコマンド名だけで実行したいのにできない場合、$env:PATHExt.PS1が含まれているか確認してください。

PowerShellのプロファイルスクリプト

PowerShellのプロファイルスクリプト(例: $PROFILE変数で示されるMicrosoft.PowerShell_profile.ps1ファイル)は、新しいセッションが開始されるたびに自動的に実行されます。このスクリプト内で定義された関数やエイリアスは、そのセッション内で利用可能になります。

Get-CommandSourceが空白の関数やエイリアスが見つかった場合、それらはプロファイルスクリプトや、そのセッションで直接定義されたものである可能性が高いです。プロファイルスクリプトの場所は$PROFILE変数で確認できます。

“`powershell
$PROFILE

出力例: C:\Users\YourUser\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

notepad $PROFILE # プロファイルスクリプトを編集する
“`

プロファイルスクリプト内の定義を探すことで、特定の関数のソースコードの場所を特定できます。

このように、Get-Commandコマンドレットは単にコマンドを検索するだけでなく、PowerShell環境の内部的な仕組みを理解し、コマンドの実行に関する問題を診断するための入り口となります。CommandTypeSourceDefinitionといったプロパティを読み解くことで、コマンドの実体や定義元をたどることが可能になります。

まとめ:Get-Commandを使いこなしてPowerShellコマンドマスターへ

PowerShellでコマンドを入力するとき、その裏側で何が起こっているのか、そして実際に実行されている「何か」がシステムのどこに存在しているのかを知ることは、PowerShellを深く理解し、より効果的に活用するための重要なステップです。従来のコマンドプロンプトの.exe.batファイルのように、全てのPowerShellコマンドが単一の場所に存在するわけではないことを理解することが出発点です。

この記事では、PowerShellにおけるコマンドの多様性、特にCmdlet、Function、Script、Alias、Applicationといった主要なコマンドタイプについて解説しました。そして、それらの「実行ファイル」にあたるものが、それぞれモジュール内のDLL、スクリプトファイル、定義元のスクリプトコード、参照先のコマンド、そして外部実行ファイルそのものであることを説明しました。

これらのコマンドの実体や定義元を特定するための最も基本的かつ強力なツールが、Get-Commandコマンドレットです。Get-Commandは、コマンド名を与えることで、そのコマンドのCommandTypeSourceDefinitionといった重要な情報を教えてくれます。これらの情報こそが、「実行ファイルはどこ?」という問いに答えるための鍵となります。

Get-Commandの様々なパラメータ、特に-CommandType-Name-Module、そして同名コマンドの存在を明らかにする-Allパラメータなどを活用することで、より効率的にコマンドを探索できます。また、PowerShellがコマンドを検索する際の優先順位を理解することで、なぜ特定のコマンドが実行されるのか、あるいはされないのかを把握できます。

Get-Commandの出力を読み解き、CommandTypeに応じた場所特定の手順(SourceDefinitionを確認し、必要に応じてGet-Moduleや環境変数PATHを調べる)を実行することで、ほとんど全てのPowerShellコマンドの実体にたどり着くことができるでしょう。

Get-Commandを使いこなすことは、単にコマンドの場所を知ることに留まりません。コマンドの仕組みや依存関係を理解し、エラー発生時の原因究明、新しいコマンドの発見、そして自信を持ってスクリプトを書くための土台となります。

さあ、あなたも気になるPowerShellコマンドについて、ぜひGet-Commandを実行してみてください。出力される情報から、そのコマンドが何者で、どこにいるのかを探る旅は、きっとPowerShellの面白さを再発見させてくれるはずです。Get-CommandをあなたのPowerShellスキル向上の一歩として、ぜひ活用してください。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール