在Windows命令行中是否有相当于'which'的内容?

由于我有时会遇到路径问题,我的某个cmd脚本被另一个程序(路径上的较早)隐藏(隐藏),因此我希望能够在Windows命令行上找到程序的完整路径,并给出只是它的名字。

有没有相当于UNIX命令'which'?

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


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

尝试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:WINDOWSsystem32cmd.exe

c:> for %i in (python.exe) do @echo.   %~$PATH:i
   C:Python25python.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:windowssystem32eventvwr.exe
Application   eventvwr.msc  c:windowssystem32eventvwr.msc

它还发现PowerShell命令,函数,别名文件通过自定义的可执行文件的扩展$Env:PATHEXT等为当前shell(非常类似于bash的定义type -a foo ) -使其成为一个更好的走向不是像其他工具where.exewhich.exe等不知道这些PowerShell命令。

你可以快速设置一个别名, sal which gcmset-alias which get-command缩写形式)。

链接地址: http://www.djcxy.com/p/793.html

上一篇: Is there an equivalent of 'which' on the Windows command line?

下一篇: What are MVP and MVC and what is the difference?