はじめに
パターンに一致するファイルの場所を表示するコマンドとしてコマンドプロンプトでは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」
コマンドプロンプトでは、先述の通りパターンに一致するファイルの場所を表示するコマンドである。
ディレクトリの指定がなければ、現在のディレクトリとPATHに含まれているディレクトリが検索される。
例えば、Cドライブ内で”win”から始まるファイルを検索したい場合、以下の通りにすれば良い。
>where /r c:\ win*
PowerShellの「where」
「Where-Object」というコマンドのエイリアスとして定義されている。
Where-Object コマンドレットは、渡されるオブジェクトのコレクションから、特定のプロパティ値を持つオブジェクトを選択します。 たとえば、 Where-…
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」とすればコマンドプロンプトの方を実行できる