メインコンテンツへスキップ

PowerShellのGet-ChildItem (gcm) でパスが通ったプログラムの場所を調べる

·1416 文字·3 分
目次

はじめに
#

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に場所が表示されません。 このような場合は、検索するコマンドにエイリアスを使用せず、さらに後ろにパイプラインでflFormat-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のエイリアス。

参考
#

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

Powershellでプロセスのメモリ使用量をロギングする
·2006 文字·5 分
PowerShellのGet-Processコマンドレットを使って、特定のプロセスのメモリ使用量を一定周期でロギングするコードを作成した。
Powershellでファイル名に連番を振ってリネームする
·2704 文字·6 分
PowerShellを使って、フォルダ内のファイルに連番を振ってリネームする方法をまとめた。
PowerShellでサブフォルダにあるファイル名を一覧表示する
··1668 文字·4 分
PowerShellでGet-ChildItemコマンドレットを使ってサブフォルダを含むファイル名を一覧表示する方法を調べた。
Windows10のPowerShellでAnaconda Pythonを使う方法
·3581 文字·8 分
Windows10のPowerShellでAnaconda Pythonを使うための手順をまとめた。
最適制御向け最適化ライブラリOpEnに入門する
··1759 文字·4 分
Rust製の最適制御向け最適化ライブラリOpEnに入門するためチュートリアルの非線形計画問題を解いたので、備忘録を兼ねてまとめた。
SphinxでPython docstringからドキュメントを自動生成する
·2014 文字·5 分
ドキュメント生成ツールSphinxを使って、Pythonスクリプトのクラスや関数のdocstringからHTMLドキュメントを自動生成する方法を解説する。