由于我有时会遇到路径问题,我自己的一个cmd脚本被另一个程序隐藏(隐藏)(路径前面),所以我希望能够在Windows命令行上找到程序的完整路径,只要给出它的名称。

是否有与UNIX命令“which”等效的命令?

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


当前回答

如果您安装了PowerShell(我建议使用),可以使用以下命令作为大致等效命令(用programName替换可执行文件的名称):

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

更多信息:我的曼维奇!PowerShell哪个

其他回答

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

例如:gcm-git或(gcm-git).Source

提示:

适用于Windows XP。自PowerShell 1.0之后可用。gcm是Get-Command cmdlet的别名。在没有任何参数的情况下,它列出了主机shell提供的所有可用命令。您可以使用Set alias which gcm创建自定义别名,并使用它,例如:(which git).Source。官方文件:https://technet.microsoft.com/en-us/library/ee176842.aspx

我在Windows上找到的最好的版本是Joseph Newcomer的“whereis”实用程序,该实用程序可以从他的网站上获得(带有源代码)。

关于“Where is”发展的文章值得一读。

只需发布此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

A测试:

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

如果将代码包装在setlocalenableextensions和endlocal中,那就不是一行了。

Windows没有现货,但它是由Services for Unix提供的,有几个简单的批处理脚本可以完成相同的任务,比如这一个。

在PowerShell下,Get命令将在$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让我们定义别名,可以这样定义。

$ sal which gcm   # short form of `Set-Alias which Get-Command`
$ which foo
...

PowerShell命令不仅仅是可执行文件(.exe、.ps1等)。它们也可以是cmdlet、函数、别名、在$Env:PATHEXT中设置的自定义可执行后缀等。Get Command能够查找并列出所有这些命令(与Bash的类型-a foo非常相似)。仅这一点就比where.exe、which.exe等(通常仅限于查找可执行文件)更好。

仅使用部分名称查找可执行文件

$ gcm *disk*

CommandType     Name                             Version    Source
-----------     ----                             -------    ------
Alias           Disable-PhysicalDiskIndication   2.0.0.0    Storage
Alias           Enable-PhysicalDiskIndication    2.0.0.0    Storage
Function        Add-PhysicalDisk                 2.0.0.0    Storage
Function        Add-VirtualDiskToMaskingSet      2.0.0.0    Storage
Function        Clear-Disk                       2.0.0.0    Storage
Cmdlet          Get-PmemDisk                     1.0.0.0    PersistentMemory
Cmdlet          New-PmemDisk                     1.0.0.0    PersistentMemory
Cmdlet          Remove-PmemDisk                  1.0.0.0    PersistentMemory
Application     diskmgmt.msc                     0.0.0.0    C:\WINDOWS\system32\diskmgmt.msc
Application     diskpart.exe                     10.0.17... C:\WINDOWS\system32\diskpart.exe
Application     diskperf.exe                     10.0.17... C:\WINDOWS\system32\diskperf.exe
Application     diskraid.exe                     10.0.17... C:\WINDOWS\system32\diskraid.exe
...

查找自定义可执行文件

与UNIX不同,在UNIX中,可执行文件是设置了可执行(+x)位的文件,而windows上的可执行文件则是$PATH env中指定的一个目录中的文件。其文件名后缀在$PATHEXT env中命名的变量。变量(默认为.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL)。

作为Get Command,也将此env作为荣誉。变量,它可以扩展为列出自定义可执行文件。例如

$ $Env:PATHEXT="$Env:PATHEXT;.dll;.ps1;.psm1;.py"     # temporary assignment, only for this shell's process

$ gcm user32,kernel32,*WASM*,*http*py

CommandType     Name                        Version    Source
-----------     ----                        -------    ------
ExternalScript  Invoke-WASMProfiler.ps1                C:\WINDOWS\System32\WindowsPowerShell\v1.0\Invoke-WASMProfiler.ps1
Application     http-server.py              0.0.0.0    C:\Users\ME\AppData\Local\Microsoft\WindowsApps\http-server.py
Application     kernel32.dll                10.0.17... C:\WINDOWS\system32\kernel32.dll
Application     user32.dll                  10.0.17... C:\WINDOWS\system32\user32.dll

有关更多选项和示例,请参见获取命令。