175

Does PowerShell have an equivalent to the which command found in most (if not all) Unix shells?

There are a number of times I'd like to know the location of something I'm running from the command line. In Unix I just do which <command>, and it tells me. I can't find an equivalent in PowerShell.

Peter Mortensen
  • 12,090
  • 23
  • 70
  • 90
Herms
  • 9,404
  • 9
  • 35
  • 36
  • [Equivalent of *Nix 'which' command in PowerShell?](https://stackoverflow.com/q/63805/995714) – phuclv Aug 16 '22 at 00:34

9 Answers9

133

This was asked and answered on Stack Overflow: Equivalent of *Nix 'which' command in PowerShell?

The very first alias I made once I started customizing my profile in PowerShell was 'which'.

New-Alias which get-command

To add this to your profile, type this:

"`nNew-Alias which get-command" | add-content $profile

The `n at the start of the last line is to ensure it will start as a new line.

Peter Mortensen
  • 12,090
  • 23
  • 70
  • 90
107

As of PowerShell 3.0, you can do

(Get-Command cmd).Path

Which also has the benefit over vanilla Get-Command of returning a System.String so you get a clean *nixy single line output like you may be used to. Using the gcm alias, we can take it down to 11 characters.

(gcm cmd).Path
FLGMwt
  • 1,171
  • 1
  • 7
  • 4
  • 5
    If `Get-Command` finds multiple results, it returns an array. Additionally, if the command it finds is not an executable, `Path` is undefined (`$null`). This makes the answer here impractical for general use without heavy modification. For a good example of both these cases, try `Get-Command where`. – jpmc26 May 30 '14 at 17:14
  • 1
    This should be the accepted answer as it actually tells you what is the Powershell equivalent of the *NIX command `where` rather than teaching you how to set aliases on Powershell, which is not the title of the question. – mastazi Jul 12 '15 at 23:31
  • 3
    @mastazi: But that fails for builtins, which is a regression compared to e.g. **zsh**'s `which`. (`where`, by the way, is actually a *Windows* utility that can do a number of different things, one of which *roughly* approximates searching for a command along the `PATH`.) Also, there's **nothing** wrong with an answer that explains how to do what was asked *and* also another, slightly more involved thing built on that. – SamB Nov 29 '17 at 23:04
16

Also answered in 2008: Is there an equivalent of 'which' on the Windows command line?

Try the where command if you've installed a Resource Kit.

Most important parts of the answer:

Windows Server 2003 and later provide the WHERE command which does some of what which does, though it matches all types of files, not just executable commands.

[snip]

In Windows PowerShell you must type where.exe.

Peter Mortensen
  • 12,090
  • 23
  • 70
  • 90
Anonymous
  • 171
  • 1
  • 4
8

Try this: get-command [your command]

Dmitry Sobolev
  • 181
  • 1
  • 2
7
function which([string]$cmd) {gcm -ErrorAction "SilentlyContinue" $cmd | ft Definition}
Gaff
  • 18,569
  • 15
  • 57
  • 68
hshen
  • 79
  • 1
  • 1
3

I just do where.exe <command> in Powershell. This is the easiest approach that I know. The .exe part is important BTW.

szx
  • 808
  • 1
  • 9
  • 22
1

Some great answers on this thread but I have found Powershell Alias's are a bit of a pain to re-define and functions are easier to write so I put this in my Powershell profile:

function global:which ([string]$command) {
  if (-not($command)) { throw "ERROR: Please supply a command name" }
  (Get-Command $command).Path
}
Oly Dungey
  • 336
  • 4
  • 7
0

Get-Command doesn't find .lnk or other types, just executable commands.

To search $env:path for any file (incl. .lnk) use

@(where.exe <file pattern> 2>$null)[0]

Returns empty string if nothing found, else full path of first encounter.

jamacoe
  • 144
  • 10
0

In PowerShell 5.1 you could use

Get-Command <command> | Format-Table Name, CommandType, DisplayName, Definition, Description, Version

The path is in Definition column.

YGautomo
  • 101
  • 2