有时候我会遇到路径问题,因为我的一个cmd脚本被其他程序(在路径上更早的位置)隐藏了,所以我想通过给出程序名来查找Windows命令行中程序的完整路径。
是否有类似于UNIX命令“which”的命令?
在UNIX中,“which command”命令可以打印给定命令的完整路径,以便轻松查找和修复这些隐藏问题。
有时候我会遇到路径问题,因为我的一个cmd脚本被其他程序(在路径上更早的位置)隐藏了,所以我想通过给出程序名来查找Windows命令行中程序的完整路径。
是否有类似于UNIX命令“which”的命令?
在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
扩展名。或者,您可以为它设置别名:
Set-Alias which where.exe
更新:推荐使用Get-Command
(别名: gcm
),因为它是 PowerShell 原生命令,可以获取所有类型的命令:别名、Cmdlet、可执行文件和函数。示例:
gcm notepad*
where.exe
不是一个内置的命令,您需要在 %PATH%
环境变量中添加 %windir%\system32
才能正常使用它。但这可能不是默认设置,如果您需要使用 where
命令,则说明您可能正在解决与环境变量路径相关的问题! - Tomasz Gandorwhere.exe
就无法工作。 - Edwardwhere.exe
可能返回多个值,此时将调用第一个/最顶部的值。示例:
C:\Windows\System32> where.exe sqlcmd.exe
c:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\SQLCMD.EXE
- phantom-99w尽管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
实际上它返回所有可能性,但您可以轻松调整其特定的搜索规则。
which
命令还是在 W95/DOS 时代,当时搜索顺序是:当前目录,然后是每个路径目录,对于 cmd.com,先执行当前目录下的 cmd.bat,再执行路径中的 cmd.exe。因此,即使当前目录下有 cmd.bat,也会先执行它,而不是路径中的 cmd.exe。 - Mawg says reinstate Monica@echo off
for %%i in (%1) do @echo. %%~$PATH:%i
要将其添加到每次运行cmd.exe时加载的alias.bat脚本中(将上述脚本放入名为C:\ usr \ aliases的新目录中):DOSKEY which=C:\usr\aliases\which.bat $*
然后,您可以创建一个脚本来使用alias.bat文件启动cmd.exe:cmd.exe /K E:\usr\aliases\alias.bat
- Brad T.在 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
由于PowerShell可以定义别名,因此which
可以像这样定义。
$ sal which gcm # short form of `Set-Alias which Get-Command`
$ which foo
...
PowerShell命令不仅仅是可执行文件(.exe
,.ps1
等),它们也可以是cmdlets、函数、别名、在$Env:PATHEXT
中设置的自定义可执行后缀等。 Get-Command
可以查找并列出所有这些命令(类似于Bash的type -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不同,Windows上的可执行文件是位于指定在$PATH
环境变量中的一个目录中,其文件名后缀在$PATHEXT
环境变量中命名(默认为.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
)。
由于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
更多选项和示例,请参见Get-Command
。
.BAT
,.CMD
等),它们被认为是可执行文件,因为它们的扩展名在PATHEXT
变量中命名(默认情况下为PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
)。其他可执行文件类型(例如.py
,.rb
等)可以通过添加文件扩展名并使用assoc
/ftype
创建可执行关联来添加 - 例如:https://docs.python.org/3.3/using/windows.html#executing-scripts-without-the-python-launcher - shalombset-alias which where.exe
如果您已经安装了PowerShell(我建议这样做),您可以使用以下命令作为粗略等效的方式(将programName替换为可执行文件的名称):
($Env:Path).Split(";") | Get-ChildItem -filter programName*
更多内容请查看:我的Manwich!PowerShell Which
which
命令会调用 where
命令。$ where php
C:\Program Files\PHP\php.exe
where pip
,并得到了三个结果。我不确定哪一个是被执行的。 - Tek KshetriCygwin 是一种解决方案。如果您不介意使用第三方解决方案,那么Cygwin就是正确的选择。
Cygwin在Windows环境中提供了类Unix的舒适体验(您可以在Windows命令行中使用它,或者使用您选择的类Unix shell)。它提供了许多类Unix命令(如which
)供Windows使用,并且您只需将该目录包含在PATH
中即可。
gcm
可以获取其他命令的格式化信息。如果您只想检索可执行文件的路径,请使用.Source
。gcm git
或(gcm git).Source
小贴士:
gcm
是Get-Command
cmdlet的别名。Set-Alias which gcm
创建自定义别名,并像这样使用:(which git).Source
。我在PowerShell文件中有一个名为'which'的函数。
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:
> get-command app.exe | format-list
完美地解决了问题! - Alexander McFarlane
which
命令。POSIX实用程序是type
。C Shell有一个which
命令,一些系统将其作为外部可执行文件。例如,在Debian Linux上,which
来自一个名为debutils
的软件包。这个外部的which
不能"看到"shell内置、别名或函数。type
可以;Bash的type
有一个选项可以抑制这种行为,只进行路径查找。 - Kaz