在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.exe
, which.exe
等不知道这些PowerShell命令。
你可以快速设置一个别名, sal which gcm
( set-alias which get-command
缩写形式)。
上一篇: Is there an equivalent of 'which' on the Windows command line?