コマンドプロンプトとPowerShellの「where」の違い

はじめに

パターンに一致するファイルの場所を表示するコマンドとしてコマンドプロンプトではwhereコマンドが存在する。

Linuxのwhichコマンド相当の使い方もできる。

>where notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe
C:\Users\Poyo\AppData\Local\Microsoft\WindowsApps\notepad.exe

しかし、PowerShellで同じコマンドを実行しても何も出力されない。

> where notepad
>

というわけで両者の違いを調べた。

コマンドプロンプトの「where」

コマンドプロンプトでは、先述の通りパターンに一致するファイルの場所を表示するコマンドである。

指定された検索パターンに一致するファイルの場所を表示する where の参照記事。
learn.microsoft.com

ディレクトリの指定がなければ、現在のディレクトリとPATHに含まれているディレクトリが検索される。

例えば、Cドライブ内で”win”から始まるファイルを検索したい場合、以下の通りにすれば良い。

>where /r c:\ win*

PowerShellの「where」

「Where-Object」というコマンドのエイリアスとして定義されている。

コマンドレットは Where-Object 、渡されるオブジェクトのコレクションから、特定のプロパティ値を持つオブジェクトを選択します。 たとえば、コマンドレッ…
learn.microsoft.com

「Get-Alias」でエイリアスを確認できる。

> Get-Alias
...
Alias           where -> Where-Object
...

PowerShellコマンドの実行結果にフィルタ的なのをかけられるっぽい。例えば、以下のようにすればwhereのエイリアスだけが表示される(galは「Get-Alias」のエイリアス)。

> gal | where Name -eq "where"

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           where -> Where-Object

ちなみに、「where.exe」とすればコマンドプロンプトの方のwhereが召喚される。

> where.exe notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe
C:\Users\Poyo\AppData\Local\Microsoft\WindowsApps\notepad.exe

また、Linuxのwhich相当の使い方をしたいならば、「Get-Command(gcm)」を使えば良い。

> gcm notepad

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     notepad.exe                                        10.0.22... C:\Windows\system32\notepad.exe

おわりに

  • コマンドプロンプトとPowerShellの「where」は別物
  • コマンドプロンプトではファイル名のパターン検索
  • PowerShellではオブジェクトのフィルタを行う「Where-Object」のエイリアス
  • PowerShellでも「where.exe」とすればコマンドプロンプトの方を実行できる