はじめに #
PowerShellでパスが通ったプログラムの場所を表示するにはGet-Command(またはgcm)コマンドレットを使います(Linuxのwhich, whereコマンドに相当)。
gcmにオプションを付けない場合、実際に実行される実体1個の場所が表示されます。プログラムの場所を全て表示する場合には-Allオプションを付けます。
例1: メモ帳 (notepad.exe) の実際に実行される実体の場所を表示する。
PS > gcm notepad
例2: パスが通ったフォルダにあるメモ帳 (notepad.exe) の場所を全て表示する。
PS > gcm notepad -All
Linuxコマンドとの対応は以下のようになります。
-Allオプションなし:Linuxのwhichコマンドに相当-Allオプションあり:Linuxのwhereコマンドに相当
以降では、gcmコマンドレットでプログラムの場所を表示する方法について詳しく解説します。
環境 #
動作を確認した環境は以下の通りです。
- Windows 10 Home 21H1
- PowerShell 5.1.19041.1320
なお、PowerShellのバージョンは、以下のコマンドで表示されるPSVersionの値から確認できます。
PS > $PSVersionTable
Get-Command #
Get-Command (gcm)コマンドレットの使い方を示します。
基本的な使い方 #
gcmの後ろに、場所を検索したいコマンドを追加します(.exeはなくてもよい)。
実行すると、実際に動く実体のプログラムとその場所が表示されます。
メモ帳 (notepad.exe) の場合の例を示します。
PS > gcm notepad
CommandType Name Version Source
----------- ---- ------- ------
Application notepad.exe 10.0.19... C:\WINDOWS\system32\notepad.exe
コマンドの実体を全て検索する #
gcmに何もオプションを付けない場合、実際に動く実体が1つだけ表示されます。
パスが通っているフォルダにある同じ名前のプログラムを全て探すには、-Allオプションを追加します。
PS > gcm notepad -All
CommandType Name Version Source
----------- ---- ------- ------
Application notepad.exe 10.0.19... C:\WINDOWS\system32\notepad.exe
Application notepad.exe 10.0.19... C:\WINDOWS\notepad.exe
-Allオプションを付けなかった場合と異なり、notepad.exeが2つ表示されました。
検索結果の詳細を表示する #
試しにgcm自身の場所を調べてみます。
PS > gcm gcm
CommandType Name Version Source
----------- ---- ------- ------
Alias gcm -> Get-Command
このように、一部のコマンドではSourceに場所が表示されません。
このような場合は、検索するコマンドにエイリアスを使用せず、さらに後ろにパイプラインでfl(Format-List のエイリアス)をつなげます。
PS > gcm Get-Command | fl
Name : Get-Command
CommandType : Cmdlet
Definition :
Get-Command [[-ArgumentList] <Object[]>] [-Verb <string[]>] [-Noun <string[]>] [-Module <string[]>] [-F
ullyQualifiedModule <ModuleSpecification[]>] [-TotalCount <int>] [-Syntax] [-ShowCommandInfo] [-All] [-
ListImported] [-ParameterName <string[]>] [-ParameterType <PSTypeName[]>] [<CommonParameters>]
Get-Command [[-Name] <string[]>] [[-ArgumentList] <Object[]>] [-Module <string[]>] [-FullyQualifiedModu
le <ModuleSpecification[]>] [-CommandType <CommandTypes>] [-TotalCount <int>] [-Syntax] [-ShowCommandIn
fo] [-All] [-ListImported] [-ParameterName <string[]>] [-ParameterType <PSTypeName[]>] [<CommonParamete
rs>]
Path :
AssemblyInfo :
DLL : C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\
System.Management.Automation.dll
HelpFile : System.Management.Automation.dll-Help.xml
ParameterSets : {[[-ArgumentList] <Object[]>] [-Verb <string[]>] [-Noun <string[]>] [-Module <string[]>] [-FullyQualifi
edModule <ModuleSpecification[]>] [-TotalCount <int>] [-Syntax] [-ShowCommandInfo] [-All] [-ListImporte
d] [-ParameterName <string[]>] [-ParameterType <PSTypeName[]>] [<CommonParameters>], [[-Name] <string[]
>] [[-ArgumentList] <Object[]>] [-Module <string[]>] [-FullyQualifiedModule <ModuleSpecification[]>] [-
CommandType <CommandTypes>] [-TotalCount <int>] [-Syntax] [-ShowCommandInfo] [-All] [-ListImported] [-P
arameterName <string[]>] [-ParameterType <PSTypeName[]>] [<CommonParameters>]}
ImplementingType : Microsoft.PowerShell.Commands.GetCommandCommand
Verb : Get
Noun : Command
これ以上深入りしませんが、Get-Commandの本体はSystem.Management.Automation.dllに関連しているようです。
Linuxとコマンドプロンプトに関する補足 #
LinuxとWindowsで似たコマンドが多いので、違いをまとめました、
Linux #
which: 実際に動くプログラムを探す。where: その名前のプログラムを全て探す。
Windowsコマンドプロンプト #
where: その名前のファイル(プログラムを含む)を全て探す(Linuxのfindに相当)。- Linuxの
whichに相当するコマンドは無し。
Windows PowerShell #
gcm: 実際に動く実体を探す。-Allオプションで全て探す。Get-Commandのエイリアス。where:(パイプラインの後ろで使って)オブジェクトをフィルタする。Where-Objectのエイリアス。