Windows 命令行上是否有等同于 “哪个” 的内容?

由于有时我会遇到路径问题,其中我自己的 cmd 脚本之一被另一个程序(位于路径的较早位置)隐藏(遮盖了),因此我希望能够在 Windows 命令行上找到程序的完整路径,如下所示只是它的名字。

是否有等效于 UNIX 命令 “哪个” 的命令?

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

答案

Windows Server 2003 和更高版本(即东西后的 Windows XP 32 位)提供where.exe程序,做了一些什么which做,虽然它所有类型的文件,而不仅仅是可执行命令相匹配。 (它与cd等内置 shell 命令不匹配。)它甚至可以接受通配符,因此where nt*%PATH%和当前目录中以nt开头的所有文件中查找所有文件。

尝试where /?求助。

请注意,Windows PowerShell 将where定义为Where-Object cmdlet的别名,因此,如果要where.exe ,则需要键入全名,而不是省略.exe扩展名。

尽管 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

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

在 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

它还可以找到为当前 shell 定义的 PowerShell cmdlet,函数,别名,通过$Env:PATHEXT等具有自定义可执行文件扩展名的文件(等价于 Bash 的type -a foo ),这使其比其他工具(例如,其中不知道这些 PowerShell 命令的where.exewhich.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
...

查找自定义可执行文件

若要查找其他非 Windows 可执行文件(python,ruby,perl 等),需要将这些可执行文件的文件扩展名添加到PATHEXT环境变量中(默认值为.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL ),以将PATH具有这些扩展名的文件标识为可执行文件。由于Get-Command也支持此变量,因此可以将其扩展为列出自定义可执行文件。例如

$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

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

Get-Command的联机帮助下可以找到更多信息和示例。

在 Windows PowerShell 中:

set-alias which where.exe

如果安装了 PowerShell(建议这样做),则可以将以下命令用作大致等效项(用 programName 代替可执行文件的名称):

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

这里还有更多: 我的三明治! PowerShell 的哪个

的 GnuWin32工具有which ,与其他 Unix 工具整体转换一起。

在 Windows CMD which调用以下where

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

Cygwin是一种解决方案。如果您不介意使用第三方解决方案,那么 Cygwin 是您的最佳选择。

Cygwin 在 Windows 环境中为您提供 * nix 的舒适性(您可以在 Windows 命令外壳中使用它,也可以使用您选择的 * nix shell)。它给你的 * nix 命令(如一大堆which )的 Windows,你可以只在您的那个目录PATH

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

例如: gcm git(gcm git).Source

花絮:

  • 适用于 Windows XP。
  • 自 PowerShell 1.0 起可用。
  • gcmGet-Command cmdlet的别名。
  • 没有任何参数,它会列出主机外壳程序提供的所有可用命令。
  • 您可以使用Set-Alias which gcm创建一个Set-Alias which gcm的自定义别名,并使用它,例如: (which git).Source
  • 官方文档: https : //technet.microsoft.com/zh-cn/library/ee176842.aspx

我在 PowerShell 配置文件中有一个名为 “哪个” 的函数

function which {
    get-command $args[0]| format-list
}

输出如下所示:

PS C:\Users\fez> which python


Name            : python.exe
CommandType     : Application
Definition      : C:\Python27\python.exe
Extension       : .exe
Path            : C:\Python27\python.exe
FileVersionInfo : File:             C:\Python27\python.exe
                  InternalName:
                  OriginalFilename:
                  FileVersion:
                  FileDescription:
                  Product:
                  ProductVersion:
                  Debug:            False
                  Patched:          False
                  PreRelease:       False
                  PrivateBuild:     False
                  SpecialBuild:     False
                  Language: