はい、承知いたしました。PowerShellのGet-Command
コマンドレットに焦点を当て、「PowerShellコマンドの実行ファイルはどこ?Get-Command
で探す」というテーマで、詳細な説明を含む約5000語の記事を作成します。記事の形式で直接ここに表示します。
PowerShellコマンドの実行ファイルはどこ?Get-Command
で探す
はじめに:PowerShellコマンドの多様性と「実行ファイル」の問い
PowerShellは、Windowsシステム管理の中心的なツールとして広く利用されています。コマンドライン操作、スクリプト作成、自動化など、その用途は多岐にわたります。PowerShellで私たちが日常的に使用する「コマンド」は、一見するとただの文字列ですが、その背後には様々な種類の実体が存在します。
例えば、ファイルやディレクトリの一覧を表示する際にGet-ChildItem
を使ったり、プロセス情報を取得する際にGet-Process
を使ったりします。また、コマンドプロンプトやBashに慣れている方なら、dir
やls
、ps
といったコマンドを入力することもあるでしょう。さらに、notepad.exe
のようなWindowsの標準アプリケーションをPowerShellから直接起動することも珍しくありません。
これらの「コマンド」は、コンピューター上のどこかにその実体、いわゆる「実行ファイル」やそれに相当するものが存在しています。しかし、その場所はコマンドの種類によって大きく異なります。
notepad.exe
のような従来のアプリケーションは、.exe
ファイルとして特定のフォルダ(例:C:\Windows\System32
)に存在します。Get-Process
のようなPowerShell独自のコマンドレットは、.dll
ファイルのような形でシステムのどこかに格納されているモジュールの一部として提供されます。- 自作のPowerShellスクリプトファイル(
.ps1
)を実行する場合、その.ps1
ファイル自体が「実行ファイル」と言えます。 - そして、
dir
やls
のようなコマンドは、実際には別のコマンドレット(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-Process
はCmdlet
(コマンドレット)であり、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.exe
はApplication
(アプリケーション、つまり外部実行ファイル)であり、そのSource
プロパティがC:\WINDOWS\system32\notepad.exe
というフルパスを示していることが分かります。これが、notepad.exe
というコマンドの「実行ファイル」の場所です。
このように、Get-Command
を使うと、コマンド名からその種類と定義元(多くの場合、実体の場所やヒント)を知ることができます。特にCommandType
とSource
プロパティは、コマンドの実体がどこにあるのかを突き止めるための鍵となります。
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
での出力:CommandType
はCmdlet
と表示されます。Source
プロパティには、そのCmdletが含まれている「モジュール名」が表示されます。これはCmdlet自体のファイルパスではありません。
-
実行ファイルの場所: Cmdlet自体は単独の実行ファイルではありません。実体はそれを定義するモジュールに含まれる
.dll
ファイル内にあります。その.dll
ファイルの場所を知るには、Source
プロパティに表示されたモジュール名を手がかりにします。- まず、
Get-Command <コマンド名>
でCommandType
がCmdlet
であることを確認し、Source
(モジュール名)を特定します。
powershell
Get-Command Get-Process
# 出力例: Source は Microsoft.PowerShell.Management - 次に、
Get-Module
コマンドレットを使って、そのモジュールに関する詳細情報を取得します。特に-Name
パラメータでモジュール名を指定します。
powershell
Get-Module -Name Microsoft.PowerShell.Management 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
の場合、そのマニフェストファイルを開くと、RootModule
やNestedModules
などの項目で実際のコードが含まれる.dll
ファイル(または.psm1
スクリプトファイル)が指定されていることが多いです。最終的なCmdletの実装コードは、その.dll
ファイル(または.psm1
)内にコンパイルされた形で存在します。
したがって、Cmdletの「実行ファイル」にあたるものは、モジュール内の特定の
.dll
ファイルであり、その場所はGet-Module
の出力するPath
プロパティから特定できます。 - まず、
2. Function (関数)
- 定義: 関数は、PowerShellスクリプト言語で記述されたコマンドのブロックです。ユーザー自身が定義することも、モジュールによって提供されることもあります。Cmdletと同様に、PowerShellプロセス内で実行されますが、通常はコンパイルされたコードではなく、PowerShellスクリプトとして定義されます。
- 特徴: 関数は柔軟性が高く、短い処理から複雑な処理までをまとめるのに適しています。PowerShellのスクリプトファイル(
.ps1
)や、プロファイルスクリプト(Microsoft.PowerShell_profile.ps1
など)内で定義できます。モジュールとして配布される関数もあります。 Get-Command
での出力:CommandType
はFunction
と表示されます。Source
プロパティには、その関数が定義されているスクリプトファイル名、モジュール名、またはセッションの一時的な定義元が表示されます。
-
実行ファイルの場所: 関数自体に「実行ファイル」という概念は直接的にはありません。実体は、関数が定義されているスクリプトコードです。
Get-Command <関数名>
を実行し、CommandType
がFunction
であることを確認します。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
での出力:CommandType
はScript
と表示されます。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など)に付けられた「別名」です。よく使う長いコマンド名を短くしたり、他のシェルのコマンド名(例:
dir
、ls
、cd
)に合わせたりするために使用されます。 - 特徴: エイリアス自体はコマンドではありません。単なる名前のマッピングです。エイリアスを実行すると、実際にはそのエイリアスが指し示している元のコマンドが実行されます。
Get-Command
での出力:CommandType
はAlias
と表示されます。Source
プロパティは通常空白です。- 重要なのは
Definition
プロパティです。このプロパティに、そのエイリアスが指し示している「元のコマンド名」が表示されます。
-
実行ファイルの場所: エイリアス自体には実行ファイルはありません。実行ファイルの場所を知るには、
Definition
プロパティが示す元のコマンドについて再度Get-Command
で調べる必要があります。Get-Command <エイリアス名>
を実行し、CommandType
がAlias
であることを確認します。Definition
プロパティを確認します。
powershell
Get-Command dir
# 出力例: CommandType は Alias, Definition は Get-ChildItemDefinition
プロパティに表示されたコマンド名を引数として、再度Get-Command
を実行します。
powershell
Get-Command Get-ChildItem
# 出力例: CommandType は Cmdlet, Source は Microsoft.PowerShell.Management- 元のコマンドの
CommandType
とSource
プロパティを見て、上記で説明した各タイプの方法で実行ファイルの場所を特定します。この例では、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
での出力:CommandType
はApplication
と表示されます。Source
プロパティには、その実行可能ファイルの「フルパス」が表示されます。
-
実行ファイルの場所: アプリケーションの場合、
Source
プロパティに表示されるフルパスそのものが、クラシックな意味での「実行ファイル」の場所です。
“`powershell
Get-Command notepad.exe
# 出力例: CommandType は Application, Source は C:\WINDOWS\system32\notepad.exeGet-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]
Get-Process [-Id]
Get-Process [-InputObject]
“`
-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のコマンド検索順序は以下の通りです(優先度が高い順):
- Alias (エイリアス)
- Function (関数)
- Cmdlet (コマンドレット)
- External Script (外部スクリプト) (
.ps1
ファイルなど) - Application (アプリケーション) (
.exe
,.com
,.bat
,.cmd
など)
例えば、Get-ChildItem
というCmdletが存在し、これに対してdir
というエイリアスが定義されている場合、dir
と入力するとエイリアスが優先され、最終的にGet-ChildItem
Cmdletが実行されます。もし、カレントディレクトリに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
出力結果のCommandType
とSource
プロパティを確認します。
ステップ2: CommandType
に応じた場所特定方法を適用する
Get-Command
の出力で確認したCommandType
に基づいて、以下のいずれかの方法で実体の場所を特定します。
-
CommandType
がApplication
の場合:Source
プロパティに表示されているパスが、その実行ファイル(.exe
,.bat
,.cmd
など)のフルパスです。これが「実行ファイル」の場所です。- 例:
Get-Command notepad.exe
->Source
はC:\WINDOWS\system32\notepad.exe
。これが場所。
-
CommandType
がScript
の場合:Source
プロパティに表示されているパスが、そのPowerShellスクリプトファイル(.ps1
)のフルパスです。これが「実行ファイル」の場所です。- 例:
Get-Command C:\Scripts\MyScript.ps1
->Source
はC:\Scripts\MyScript.ps1
。これが場所。
-
CommandType
がCmdlet
の場合: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
->Source
はMicrosoft.PowerShell.Management
。Get-Module -Name Microsoft.PowerShell.Management | Select-Object Path
-> パスが表示され、その中の.dll
ファイルなどにCmdletの実体がある。
-
CommandType
がFunction
またはFilter
の場合:Source
プロパティを確認します。Source
がスクリプトファイルのパスであれば、そのファイル内に定義されています。そのファイルが実体の場所です。Source
がモジュール名であれば、Cmdletと同様にGet-Module
でモジュールの場所(.psm1
や.dll
など)を調べます。関数はそのモジュールファイル内に定義されています。Source
が空白またはセッション固有の名前であれば、その関数は現在のセッション内で直接定義されています(例: プロファイルスクリプトやコマンドライン)。プロファイルスクリプトに定義されている場合は、$PROFILE
変数の示すファイルを確認します。
- 例:
Get-Command Get-HelloWorld
(自作関数) ->Source
はC:\Temp\MyFunctions.ps1
。これが場所。 - 例:
Get-Command Get-NetAdapter
->Source
はNetAdapter
。Get-Module -Name NetAdapter | Select-Object Path
でモジュールの場所を確認。
-
CommandType
がAlias
の場合:- エイリアス自体に実行ファイルはありません。
Definition
プロパティが指し示している元のコマンド名を調べます。 Definition
プロパティに表示されたコマンド名(例:OriginalCommand
)を引数にして、再度Get-Command
を実行します。
powershell
Get-Command OriginalCommand- 再実行した
Get-Command
の出力に基づいて、上記いずれかの方法でOriginalCommand
の実体の場所を特定します。 - 例:
Get-Command dir
->Definition
はGet-ChildItem
。Get-Command Get-ChildItem
を実行し、Cmdletの場所特定方法に従う。
- エイリアス自体に実行ファイルはありません。
具体例で確認
いくつかのよく使うコマンドについて、このステップで場所を特定してみましょう。
-
ipconfig
:Get-Command ipconfig
CommandType Name Version Source
----------- ---- ------- ------
Application ipconfig.exe 10.0.19041.1 C:\WINDOWS\System32\ipconfig.exeCommandType
はApplication
、Source
はC:\WINDOWS\System32\ipconfig.exe
。- 場所:
C:\WINDOWS\System32\ipconfig.exe
ファイルそのものが実行ファイル。
-
Get-ComputerInfo
:Get-Command Get-ComputerInfo
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-ComputerInfo 1.0.0.0 Microsoft.PowerShell.ManagementCommandType
はCmdlet
、Source
はMicrosoft.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内にある。
-
cd
:Get-Command cd
CommandType Name Version Source
----------- ---- ------- ------
Alias cd -> Set-LocationCommandType
はAlias
、Definition
はSet-Location
。Get-Command Set-Location
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Set-Location 3.1.0.0 Microsoft.PowerShell.ManagementCommandType
はCmdlet
、Source
はMicrosoft.PowerShell.Management
モジュール。- 場所:
cd
はSet-Location
コマンドレットへのエイリアス。Set-Location
Cmdletの実体は、Microsoft.PowerShell.Management
モジュール内のDLLにある。場所は上記Get-ComputerInfo
の例と同様の方法で特定できるモジュールパス。
-
カレントディレクトリにある
MyScript.ps1
: (カレントディレクトリをPATHに追加していない場合)Get-Command MyScript.ps1
(カレントディレクトリをPATHに追加していないため見つからないか、別の場所の同名ファイルが見つかる可能性)- 正確に指定:
Get-Command .\MyScript.ps1
(カレントディレクトリにあることを明示)
CommandType Name Version Source
----------- ---- ------- ------
Script MyScript.ps1 C:\Current\Directory\MyScript.ps1 CommandType
はScript
、Source
はC:\Current\Directory\MyScript.ps1
。- 場所:
C:\Current\Directory\MyScript.ps1
ファイルそのものが実行ファイル。
これらのステップを踏むことで、PowerShellコマンドの種類に応じた「実行ファイル」やその実体の場所を確実に特定することができます。
応用的な使い方とトラブルシューティング
Get-Command
とその出力情報は、コマンドの場所を特定するだけでなく、PowerShell環境に関する様々な応用的な調査やトラブルシューティングにも役立ちます。
特定のパスにある実行可能ファイルがPowerShellから実行できない場合
Get-Command <ファイル名>
でApplication
として見つかるにも関わらず、コマンド名だけで実行できない場合があります。原因としては以下が考えられます。
- 環境変数
PATH
にそのディレクトリが含まれていない:Get-Command
はPATH
を検索します。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
でも見つかるようになります。
- インストール後、
環境変数 PATH
と PATHExt
の確認
Application
タイプのコマンドの場所特定やトラブルシューティングには、環境変数PATH
とPATHExt
の理解が不可欠です。
$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-Command
でSource
が空白の関数やエイリアスが見つかった場合、それらはプロファイルスクリプトや、そのセッションで直接定義されたものである可能性が高いです。プロファイルスクリプトの場所は$PROFILE
変数で確認できます。
“`powershell
$PROFILE
出力例: C:\Users\YourUser\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
notepad $PROFILE # プロファイルスクリプトを編集する
“`
プロファイルスクリプト内の定義を探すことで、特定の関数のソースコードの場所を特定できます。
このように、Get-Command
コマンドレットは単にコマンドを検索するだけでなく、PowerShell環境の内部的な仕組みを理解し、コマンドの実行に関する問題を診断するための入り口となります。CommandType
やSource
、Definition
といったプロパティを読み解くことで、コマンドの実体や定義元をたどることが可能になります。
まとめ:Get-Command
を使いこなしてPowerShellコマンドマスターへ
PowerShellでコマンドを入力するとき、その裏側で何が起こっているのか、そして実際に実行されている「何か」がシステムのどこに存在しているのかを知ることは、PowerShellを深く理解し、より効果的に活用するための重要なステップです。従来のコマンドプロンプトの.exe
や.bat
ファイルのように、全てのPowerShellコマンドが単一の場所に存在するわけではないことを理解することが出発点です。
この記事では、PowerShellにおけるコマンドの多様性、特にCmdlet、Function、Script、Alias、Applicationといった主要なコマンドタイプについて解説しました。そして、それらの「実行ファイル」にあたるものが、それぞれモジュール内のDLL、スクリプトファイル、定義元のスクリプトコード、参照先のコマンド、そして外部実行ファイルそのものであることを説明しました。
これらのコマンドの実体や定義元を特定するための最も基本的かつ強力なツールが、Get-Command
コマンドレットです。Get-Command
は、コマンド名を与えることで、そのコマンドのCommandType
やSource
、Definition
といった重要な情報を教えてくれます。これらの情報こそが、「実行ファイルはどこ?」という問いに答えるための鍵となります。
Get-Command
の様々なパラメータ、特に-CommandType
や-Name
、-Module
、そして同名コマンドの存在を明らかにする-All
パラメータなどを活用することで、より効率的にコマンドを探索できます。また、PowerShellがコマンドを検索する際の優先順位を理解することで、なぜ特定のコマンドが実行されるのか、あるいはされないのかを把握できます。
Get-Command
の出力を読み解き、CommandType
に応じた場所特定の手順(Source
やDefinition
を確認し、必要に応じてGet-Module
や環境変数PATH
を調べる)を実行することで、ほとんど全てのPowerShellコマンドの実体にたどり着くことができるでしょう。
Get-Command
を使いこなすことは、単にコマンドの場所を知ることに留まりません。コマンドの仕組みや依存関係を理解し、エラー発生時の原因究明、新しいコマンドの発見、そして自信を持ってスクリプトを書くための土台となります。
さあ、あなたも気になるPowerShellコマンドについて、ぜひGet-Command
を実行してみてください。出力される情報から、そのコマンドが何者で、どこにいるのかを探る旅は、きっとPowerShellの面白さを再発見させてくれるはずです。Get-Command
をあなたのPowerShellスキル向上の一歩として、ぜひ活用してください。