如何在Windows中找到可执行文件的位置?


152

我记得我曾经使用过一个名为的工具where来在控制台中找到任何可执行程序的位置:

 C:\Tmp\Where myTool.exe
 C:\Program Files\MyApp\myTools.exe
 ....

现在我找不到此工具。不确定Windows是否具有内置工具来执行该搜索?



如果该应用程序正在运行,并且您需要知道其位置,请使用Process Explorer(来自Sys Internals)。
Ganesh R.

6
where在Windows 7 Enterprise上为我工作
Bohemian 2014年

4
PAGING OP:请更新接受的答案:)
Jake

1
@ David.Chu.ca请更新接受的答案
Matt Frear

Answers:


3

我认为您可能正在考虑Linux 中的哪个命令。

$ which bash
/bin/bash

我不知道Windows中的等效工具。

编辑:我只是记得有一个名为Unix Utils for Windows 的软件包,它将为您提供此功能。


github.com/bmatzelle/gow/wiki是Unix Utils的后代,使用方便,在Windows上称为Gnu。它具有更多的实用程序和安装程序。
西蒙D

33
该死,我不能投票。OP是正确的,并且有一个“ where.exe”。请在此处查看以下答案:superuser.com/a/440904/59929
Piers Karsenbarg 2012年

1
想在这里投票,但问题的措辞使之成为有效答案:I remembered that I used a tool...Now I cannot find this tool. Not sure if Windows has [it]

351

根据StackOverflow的答案,在Windows是否有“哪个”的等效项?where.exe在Windows 7和Windows Server 2003及更高版本上执行此操作:

C:\> where ping

输出:

C:\Windows\System32\PING.EXE

19
这应该是makred为,随着工作没有安装额外的软件正确的答案
曲奇

24
这个答案的重要部分是在powershell中,它where是的默认别名Where-Object,因此您需要使用where.exegcm/Get-Command
Dave Andersen

2
那么powershell。如何在Powershell中实现相同目标?
krv

1
@krv正如@DaveAndersen提到的那样,您可以在powershell中键入Get-Command ping(或仅输入gcm ping),这将为您提供完整的路径以及其他一些信息。
山姆

22

编辑: 我应该添加,如果您不能从命令提示符下使用WHERE命令,请检查您的PATH变量。(只需使用“ path”命令。)确保C:\ Windows \ System32在您的路径中。那是“ where.exe”所在的位置。

您正在寻找的命令在哪里!WHERE就像UNIX shell内置的“哪个”和“定位”命令之间的交叉,因为它既适用于命令可执行文件,也适用于常规文件。

它也比这两个中的任何一个都复杂一些,尽管通常

WHERE <file>

将工作。

它与“ locate”命令的不同之处在于它不浏览整个文件系统。而是,默认行为是在两个位置查找文件:

  • 当前目录。
  • PATH变量中的所有目录。

因此,可以在不指定目录的情况下直接从命令提示符运行的任何命令都可以通过WHERE命令找到。(因为类似这样的命令已在PATH变量列表中。)

如果你想搜索在命令路径变量,你可以使用:

WHERE "$path:<search text>"

另一方面,如果要在目录树中查找文件的所有副本,则可以使用:

WHERE /R <Top Level Directory> <search text>

最后,WHERE将在PATHEXT变量中查找命令和带有扩展名的任何文件,而不包括扩展名。所有其他文件必须完全指定或使用通配符指定。

以文件“ dxdiag.exe”和“ dxdiagn.dll”为例。请注意以下命令及其输出:

WHERE /R C:\Windows dxdiag

C:\Windows\System32\dxdiag.exe
C:\Windows\SysWOW64\dxdiag.exe
C:\Windows\WinSxS\amd64_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_7c8d3f96e7882ec7\dxdiag.exe
C:\Windows\WinSxS\x86_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_206ea4132f2abd91\dxdiag.exe

它成功返回“ dxdiag.exe”的所有版本,因为“ .exe”是PATHEXT变量中的扩展名之一。(注意:“ WHERE dxdiag”也可以正常工作,因为PATH变量中包含C:\ Windows \ System32。)

WHERE /R C:\Windows dxdiagn

另一方面,由于“ .dll” 不在 PATHEXT中,因此无法返回任何结果。

在这种情况下,请查看添加通配符后得到的结果:

WHERE /R C:\Windows dxdiagn*

C:\Windows\System32\dxdiagn.dll
C:\Windows\System32\en-US\dxdiagn.dll.mui
C:\Windows\SysWOW64\dxdiagn.dll
C:\Windows\SysWOW64\en-US\dxdiagn.dll.mui
C:\Windows\WinSxS\amd64_microsoft-windows-d..iagnostic.resources_31bf3856ad364e35_6.2.9200.16384_en-us_daccd04369b09c70\dxdiagn.dll.mui
C:\Windows\WinSxS\amd64_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_7c8d3f96e7882ec7\dxdiagn.dll
C:\Windows\WinSxS\x86_microsoft-windows-d..iagnostic.resources_31bf3856ad364e35_6.2.9200.16384_en-us_7eae34bfb1532b3a\dxdiagn.dll.mui
C:\Windows\WinSxS\x86_microsoft-windows-d..x-directxdiagnostic_31bf3856ad364e35_6.2.9200.16384_none_206ea4132f2abd91\dxdiagn.dll

它会成功返回dxdiagn.dll的所有版本。

有关更多信息,请使用“ WHERE /?”。希望这可以帮助!


2
where where C:\Windows\System32\where.exe:)
vp_arth '16

1
@vp_arth只是在想完全相同的事情:)
工程师

10

用途dir

cd \
dir /s /b mytool.exe

cd \部分会将您更改为驱动器的根目录,以确保搜索从层次结构的顶部开始。


似乎在执行命令行Windows搜索。
Ganesh R.

5
这会对驱动器进行递归搜索,并且将永远花费时间。
djhowell

6
在PATH环境变量中查找ARE N'T可执行文件的唯一方法是执行此操作。他从来没有指明自己的道路,他说任何可执行文件
约翰T

它确实找到可执行文件,但是要花一点时间。
Michael Z

当然,这仅在您知道可执行文件的名称或名称的至少一部分时才有效
Oliver Williams

8

请注意,PowerShell可能有些不同:

PS C:\Users\Rob.wb-devel> where ping

PS C:\Users\Rob.wb-devel> where git

PS C:\Users\Rob.wb-devel> whereis.bat git
C:\Program Files (x86)\Git\cmd\git.exe

PS C:\Users\Rob.wb-devel> where.exe git
C:\Program Files (x86)\Git\cmd\git.exe

谢谢,这对cmd和PowerShell都适用
Chen Ding-Yi Chen

3

令人沮丧的是它不是内置于简单命令中的。

但是,有几种解决方案,其中一种是批处理文件

创建一个批处理文件(which.bat),如下所示:

@setlocal
@set P2=.;%PATH%
@for %%e in (%PATHEXT%) do @for %%i in (%~n1%%e) do @if NOT "%%~$P2:i"=="" echo %%~$P2:i 

它在本地目录中查找,将采用带扩展名或不带扩展名的文件名参数,并从当前目录或PATH返回第一个匹配项。

然后像运行which cmd.execmd.exe 一样运行它,如果您键入,它将执行cmd




1

在PowerShell中

(@($env:path.split(";")) + (pwd).Path)  | where { dir $_ -ErrorAction SilentlyContinue |? Name -eq foo.exe }

您可以轻松地将其转换为Cmdlet。

如编辑建议的那样,完成此操作的另一种方法是:

get-command notepad.exe | select Source

0

如果只需要启动它的路径,通常最好使用start命令。例如,无论安装在何处,都可以使用“ start chrome.exe”启动Chrom {e | ium}。


0

嘿,我只需要发布此Windows的一个衬里批处理文件:

C:>type wh.cmd
@for %%f in (%*) do for %%e in (%PATHEXT% .dll .lnk) do for %%b in (%%f%%e) do for %%d in (%PATH%) do if exist %%d\%%b echo %%d\%%b

一个测试:

C:>wh ssh
C:\cygwin64\bin\ssh.EXE
C:\Windows\System32\OpenSSH\\ssh.EXE

如果将代码包装在setlocal enableextensions和中endlocal,则代码不是一味之选,这对于默认情况下未启用扩展名的用户是必需的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.