题 在Windows命令行上是否有相应的“哪个”?


由于我有时遇到路径问题,其中一个我自己的cmd脚本被另一个程序隐藏(阴影)(在路径的前面),我希望能够在Windows命令行上找到程序的完整路径,给定只是它的名字。

有没有相当于UNIX命令'哪个'?

在UNIX上, which command 打印给定命令的完整路径,以便轻松查找和修复这些阴影问题。


1900
2017-11-20 04:19


起源


Foredecker:“which”在PATH中搜索在shell提示符下键入命令时将运行的可执行文件。 - Greg Hewgill
例如,如果您安装了5个版本的Java并且您不知道正在使用哪个版本,则可以键入“which java”并且它为您提供了二进制文件的PATH - ninesided
@Foredecker,MR说它在Win2k3中的“位置”,但Win2k3不是问题的一部分。如果“where”不在其他Windows版本中,则其他答案也有效。 IMNSHO,适用于所有Windows版本的答案是最好的。此外,其他答案没有错,只是采用不同的方式。 - paxdiablo
我知道这个问题出现在SuperUser之前,但它可能属于那里。 - palswim
没有 which 标准Unix中的命令。 POSIX实用程序是 type。 C Shell有一个命令,有些系统将它作为外部可执行文件。例如,在Debian Linux上, which 来自一个名为的包 debutils。这个外在的 which 没有“看到”shell内置函数,别名或函数。 type 做; bash的 type 有一个选项来抑制它,只是做一个路径查找。 - Kaz


答案:


Windows Server 2003及更高版本(即Windows XP 32位之后的任何内容)提供了 where.exe 做一些什么的程序 which 虽然它匹配所有类型的文件,但不仅仅是可执行命令。 (它与内置的shell命令不匹配 cd。)它甚至会接受通配符,所以 where nt* 找到你的所有文件 %PATH% 和名称以。开头的当前目录 nt

尝试 where /? 求助。

请注意,Windows PowerShell定义 where 作为别名 Where-Object 小命令,所以如果你想 where.exe,你需要输入全名而不是省略 .exe 延期。


2107
2017-11-20 05:52



没有为什么 grep的 考察了 内容 它的输入,你必须明确给出。 哪一个 和 where.exe 只看一下 名 PATH环境变量中设置的一组目录中的文件。 - Michael Ratanapintha
@ Ajedi32 - 正确, 哪一个 不是在XP中。正如我所说,“Windows Server 2003及更高版本”。 - Michael Ratanapintha
适用于Windows 8 - rob
注意这一点 不会在powershell工作 除非你输入where.exe - Jonny Leeds
记住这一点 where.exe 不是内置的shell,你需要拥有 %windir%\system32 在你的 %PATH%  - 使用可能不是这种情况 where 表明你可能正在解决你的道路问题! - Tomasz Gandor


虽然Windows的更高版本有 where 命令,您也可以使用环境变量修饰符在Windows XP中执行此操作,如下所示:

c:\> for %i in (cmd.exe) do @echo.   %~$PATH:i
   C:\WINDOWS\system32\cmd.exe

c:\> for %i in (python.exe) do @echo.   %~$PATH:i
   C:\Python25\python.exe

您不需要任何额外的工具,但不限于此 PATH 因为您可以替换您希望使用的任何环境变量(当然是路径格式)。


并且,如果你想要一个可以处理PATHEXT中的所有扩展的东西(就像Windows本身那样),这个就可以了:

@echo off
setlocal enableextensions enabledelayedexpansion

:: Needs an argument.

if "x%1"=="x" (
    echo Usage: which ^<progName^>
    goto :end
)

:: First try the unadorned filenmame.

set fullspec=
call :find_it %1

:: Then try all adorned filenames in order.

set mypathext=!pathext!
:loop1
    :: Stop if found or out of extensions.

    if "x!mypathext!"=="x" goto :loop1end

    :: Get the next extension and try it.

    for /f "delims=;" %%j in ("!mypathext!") do set myext=%%j
    call :find_it %1!myext!

:: Remove the extension (not overly efficient but it works).

:loop2
    if not "x!myext!"=="x" (
        set myext=!myext:~1!
        set mypathext=!mypathext:~1!
        goto :loop2
    )
    if not "x!mypathext!"=="x" set mypathext=!mypathext:~1!

    goto :loop1
:loop1end

:end
endlocal
goto :eof

:: Function to find and print a file in the path.

:find_it
    for %%i in (%1) do set fullspec=%%~$PATH:i
    if not "x!fullspec!"=="x" @echo.   !fullspec!
    goto :eof

它实际上返回了所有可能性,但您可以轻松地针对特定搜索规则进行调整。


257
2017-11-20 05:48



嘿,我希望我已经学会了!太糟糕了,它不适用于MS-DOS或Win9x(即使用command.com)。 (Raymond Chen有一个更精细的版本,你可以把它变成一个批处理文件: blogs.msdn.com/oldnewthing/archive/2005/01/20/357225.aspx ) - Michael Ratanapintha
@Michael,如果你还在使用DOS或Win95,那么在路径上查找可执行文件就是 最小 你的问题:-) - paxdiablo
Windows将.exe识别为可执行文件。上次我编码了一个 which 回到W95 / DOS天,搜索顺序是 - 当前目录,然后是每个路径目录,对于cmd.com,然后是cmd.exe,然后是cmd.bat那么,即使cmd.bat在当前目录中也执行了befroe cmd.exe路径中的soemwhere - Mawg
@mawg,原来是你知道扩展的地方,因为它反映了UNIX下的东西(不会发生扩展添加技巧)。我现在已经添加了一个可以做你想做的事情,但它不再是一个简单的命令,而是一个脚本。它首先尝试unadorned命令然后每个扩展命令。希望有所帮助。您可以根据需要调整它的需要(例如,如果您想要与Windows相同的搜索顺序 - 这个显示所有可能性)。 - paxdiablo
要将其转换为批处理脚本,请创建名为“which.bat”的文件: @echo off for %%i in (%1) do @echo. %%~$PATH:%i  要将它添加到每次运行cmd.exe时加载的alias.bat脚本(将上述脚本放在名为C:\ usr \ aliases的新目录中): DOSKEY which=C:\usr\aliases\which.bat $*  然后,您可以创建一个脚本以使用alias.bat文件启动cmd.exe: cmd.exe /K E:\usr\aliases\alias.bat - Brad T.


在PowerShell下 get-command 将在任何地方找到可执行文件 $Env:PATH

get-command eventvwr

CommandType   Name          Definition
-----------   ----          ----------
Application   eventvwr.exe  c:\windows\system32\eventvwr.exe
Application   eventvwr.msc  c:\windows\system32\eventvwr.msc

它还可以找到powershell cmdlet,函数,别名,带有自定义可执行文件扩展名的文件 $Env:PATHEXT等等为当前shell定义(非常类似于bash的 type -a foo) - 使它成为比其他工具更好的选择 where.exewhich.exe等不知道这些PowerShell命令。

您可以使用快速设置别名 sal which gcm (简称 set-alias which get-command)。


105
2017-11-26 02:07





在windows powershell中:

set-alias which where.exe

39
2017-11-30 23:00





如果您安装了PowerShell(我推荐),您可以使用以下命令作为粗略的等效项(替换程序名为您的可执行文件的名称):

($Env:Path).Split(";") | Get-ChildItem -filter programName*

更多信息: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx


37
2017-11-20 05:16



我正在寻找这个精确的精简powershell命令。我一直在使用where.exe但是在解析其输出之前不得不乱用错误代码远远不如本机PowerShell解决方案。谢谢! - scobi
如果你有PowerShell,你应该使用 Get-Command。 - jpmc26
但 ($Env:Path).Split(";") | Get-ChildItem -filter programName* 是如此容易打字...... ;-) - Craig
Downvoting支持Get-Command(对不起@RexE) - piers7
如果路径中的变量通常由系统解析(也就是%JAVA_HOME%),则也会失败。 - dragon788


的GnuWin32 工具有 which,以及一大堆其他Unix工具。


31
2017-11-20 06:44



用这个下载 sourceforge.net/projects/getgnuwin32/?source=dlp - Kalpesh Soni


在Windows CMD中 which 电话 where

$ where php
C:\Program Files\PHP\php.exe

19
2018-04-01 12:02





很惊讶,没有人提到过 cygwin的 作为一种解决方案。如果您不介意使用第三方解决方案,那么cygwin就是您的选择。

Cygwin的 在Windows环境中为您提供* nix的舒适度(您可以在Windows命令shell中使用它,或使用您选择的* nix shell)。它为您提供了大量的* nix命令(如 which)对于Windows,你可以在你的目录中包含该目录 PATH


15
2017-10-12 17:02



Ferruccio之前提到的GnuWin32在这种情况下要好得多,因为你可以有本机 哪里 可执行的。 - Piotr Dobrogost
GnuWin32很棒,而且我使用它,但是如果你想要这个功能而不安装GnuWin32工具where.exe似乎是正确的调用。虽然,我确实将GnuWin32工具放在我们网络上的\ bin $共享中,这样我就可以在工作站(以及批处理文件)中使用它们,而不是在本地安装它们。 - Craig
当我们在Windows中讨论Cygwin的用法时,我更喜欢:cygpath -w“`<appname>`” - mpasko256


在PowerShell中,它是 gcm,提供有关其他命令的格式化信息。如果要仅检索可执行文件的路径,请使用 .Source

例如: gcm git 要么 (gcm git).Source

小知识:


11
2017-09-11 11:32





从这里获取unxutils: http://sourceforge.net/projects/unxutils/

Windows平台上的黄金,将所有漂亮的unix实用程序放在标准的Windows DOS上。多年来一直在使用它。

它有一个'包括'。请注意,它虽然区分大小写。

注意:安装它会在某处爆炸zip并将... \ UnxUtils \ usr \ local \ wbin \添加到系统路径env变量中。


8
2018-03-26 00:08



它不区分大小写,我还要说哪个java.exe而不是哪个java-windows 7 - Kalpesh Soni
虽然与换行有关但它有一些令人沮丧的事情;例如,grep,如果没有你输入,就不会匹配EOL . 对于\ r。这肯定是99%的解决方案! - dash-tom-bang