如何测试Windows批处理文件中%PATH%中是否存在可执行文件?

时间:2011-01-24 12:08:03

标签: windows batch-file batch-processing

我正在寻找一种简单的方法来测试Windows批处理文件中PATH环境变量中是否存在可执行文件。

不允许使用操作系统未提供的外部工具。所需的最小Windows版本是Windows XP。

9 个答案:

答案 0 :(得分:63)

for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
if defined FOUND ...

如果您需要针对不同的扩展程序,只需迭代PATHEXT

set FOUND=
for %%e in (%PATHEXT%) do (
  for %%X in (myExecutable%%e) do (
    if not defined FOUND (
      set FOUND=%%~$PATH:X
    )
  )
)

可能是where在旧版Windows上也已存在,但我无权访问,因此我无法分辨。在我的机器上,以下也有效:

where myExecutable

如果找不到,则返回非零退出代码。但是,在批处理中,您可能还希望将输出重定向到NUL

请记住

批处理(.bat)文件和命令行中的解析不同(因为批处理文件有%0 - %9),因此您必须将%加倍。在命令行上,这不是必需的,因此对于变量只是%X

答案 1 :(得分:62)

Windows Vista及更高版本附带一个名为where.exe的程序,用于搜索路径中的程序。它的工作原理如下:

D:\>where notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe

D:\>where where
C:\Windows\System32\where.exe

要在批处理文件中使用,您可以使用/q开关,它只设置ERRORLEVEL并且不会产生任何输出。

where /q myapplication
IF ERRORLEVEL 1 (
    ECHO The application is missing. Ensure it is installed and placed in your PATH.
    EXIT /B
) ELSE (
    ECHO Application exists. Let's go!
)

或者是一个简单(但不太可读)的简写版本,用于打印邮件并退出应用程序:

where /q myapplication || ECHO Cound not find app. && EXIT /B

答案 2 :(得分:18)

这是一个简单的解决方案,尝试运行应用程序并随后处理 之后的任何错误。

file.exe /?  2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path

错误代码9009通常表示找不到文件。

唯一的缺点是,如果找到file.exe实际执行(在某些情况下这是不可取的)。

答案 3 :(得分:4)

这可以通过参数替换来完成。

%~$PATH:1

这将返回%1中可执行文件名的完整路径,否则为空字符串。

这不适用于用户定义的变量。因此,如果可执行文件名不是脚本的参数,那么您需要一个子例程。例如:

call :s_which app.exe
if not "%_path%" == "" (
  "%_path%"
)

goto :eof

:s_which
  setlocal
  endlocal & set _path=%~$PATH:1
  goto :eof

请参阅http://ss64.com/nt/syntax-args.html

答案 4 :(得分:0)

@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....

答案 5 :(得分:0)

有时这个简单的解决方案有效,您可以检查输出是否符合您的预期。第一行运行命令并获取标准输出的最后一行。

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.

答案 6 :(得分:0)

使用命令:powershell Test-Path" exe,您正在寻找"

如果存在则返回True,否则返回False。

答案 7 :(得分:0)

对于那些正在寻找PowerShell选项的用户。您可以使用Get-Command cmdlet传递两个项目。首先给当前目录位置加上前缀.\,然后仅给出exe名称。

(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null

如果找到本地路径或系统范围路径,则返回true。

答案 8 :(得分:0)

如果您正在启动文件夹中搜索类似我的东西,则应该进入文件夹。例如,我在启动文件夹中搜索exe,并使用

这样的代码
@echo off
cd C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
where /q program.exe
IF ERRORLEVEL 1 (
echo F | xcopy /Y /S /I /E "\\programsetup\programsetup.exe" 
"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\program.exe"
) ELSE (
ECHO Application exists. Let's go!
)