首页  编辑  

在Path中搜索某个文件并返回其完整路径 which

Tags: /计算机文档/脚本,批处理/   Date Created:

下面的命令,给定一个命令的文件名(不包含扩展名),可以自动搜索Path路径中是否存在对应的命令 ,并自动返回完整路径。

例如 which notepad返回C:\Windows\System32\notepad.exe

which.bat 内容:

  1. @rem Taken from http://blogs.msdn.com/b/oldnewthing/archive/2005/01/20/357225.aspx
  2. @echo off
  3. REM 下面这句是原始的代码: which notepad
  4. for %%e in (%PATHEXT%) do for %%i in (%1%%e) do if NOT "%%~$PATH:i"=="" echo %%~$PATH:i & goto end
  5. REM 下面这句是为了兼容处理输入后缀名的情况: which notepad.exe
  6. for %%d in ("%path:;=" "%") do if exist %%~d\%1 echo %%~d\%1 & goto end
  7. :end


which.bat

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 文件后缀优先级列表
  4. set extensions=exe com cmd bat
  5. rem 获取参数,支持不输入后缀的情况
  6. set arg=%~1
  7. if "%arg:~-4%" == ".exe" (
  8.     set name=%arg%
  9.     set has_ext=1
  10. else if "%arg:~-4%" == ".com" (
  11.     set name=%arg%
  12.     set has_ext=1
  13. else if "%arg:~-4%" == ".cmd" (
  14.     set name=%arg%
  15.     set has_ext=1
  16. else if "%arg:~-4%" == ".bat" (
  17.     set name=%arg%
  18.     set has_ext=1
  19. else (
  20.     set name=%arg%
  21.     set has_ext=0
  22. )
  23. rem 循环遍历 PATH 中的目录
  24. for %%d in ("%path:;=" "%"do (
  25.     rem 拼接出要查找的文件名,支持输入后缀的情况
  26.     if !has_ext! == 1 (
  27.         set file=%%~d\%name%
  28.     ) else (
  29.         for %%e in (%extensions%) do (
  30.             set file=%%~d\%name%.%%e
  31.             if exist "!file!" goto found
  32.         )
  33.     )
  34.     if exist "!file!" goto found
  35. )
  36. rem 如果没有找到,则输出错误信息
  37. echo %1 not found
  38. goto end
  39. :found
  40. echo !file!
  41. :end

which.bat 的另外一个简短版本: