182

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.

1

9 Answers 9

135

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.

0
113

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
3
  • 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, 2014 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, 2015 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, 2017 at 23:04
19

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.

7
function which([string]$cmd) {gcm -ErrorAction "SilentlyContinue" $cmd | ft Definition}
7

Try this: get-command [your command]

6

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

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
}
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.

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.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .