由于我有时会遇到路径问题,我自己的一个cmd脚本被另一个程序隐藏(隐藏)(路径前面),所以我希望能够在Windows命令行上找到程序的完整路径,只要给出它的名称。
是否有与UNIX命令“which”等效的命令?
在UNIX上,哪个命令打印给定命令的完整路径,以便轻松查找和修复这些阴影问题。
由于我有时会遇到路径问题,我自己的一个cmd脚本被另一个程序隐藏(隐藏)(路径前面),所以我希望能够在Windows命令行上找到程序的完整路径,只要给出它的名称。
是否有与UNIX命令“which”等效的命令?
在UNIX上,哪个命令打印给定命令的完整路径,以便轻松查找和修复这些阴影问题。
当前回答
Windows没有现货,但它是由Services for Unix提供的,有几个简单的批处理脚本可以完成相同的任务,比如这一个。
其他回答
如果您安装了PowerShell(我建议使用),可以使用以下命令作为大致等效命令(用programName替换可执行文件的名称):
($Env:Path).Split(";") | Get-ChildItem -filter programName*
更多信息:我的曼维奇!PowerShell哪个
我在互联网上找到的Unix Win32端口没有一个是令人满意的,因为它们都有一个或多个缺点:
不支持Windows PATHEXT变量。(它定义了在扫描路径之前隐式添加到每个命令的扩展列表,以及顺序。)(我使用了很多tcl脚本,没有公开可用的工具可以找到它们。)不支持cmd.exe代码页,这会使它们错误地显示带有非ascii字符的路径。(我对此非常敏感,我的名字中有一个ç:-)cmd.exe和PowerShell命令行中不支持不同的搜索规则。(没有公开可用的工具可以在PowerShell窗口中找到.ps1脚本,但在cmd窗口中找不到!)
所以我最终写了我自己的,这正确地支持了以上所有内容。
此处可用:http://jf.larvoire.free.fr/progs/which.exe
我正在使用GOW(Windows上的GNU),这是Cygwin的一个轻量级版本。你可以在这里从GitHub获取它。
GOW(Windows上的GNU)是Cygwin的轻量级替代品。它使用一个方便的Windows安装程序,可安装大约130个编译为本机win32的有用的开源UNIX应用程序二进制文件。它设计得尽可能小,大约10 MB与Cygwin相反,Cygwin可以运行超过100 MB,这取决于选项。-关于描述(Brent R.Matzelle)
GOW中包含的命令列表截图:
在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具有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
它实际上返回所有可能性,但您可以很容易地针对特定搜索规则进行调整。