我正在寻找一种简单的方法来测试Windows批处理文件中PATH环境变量中是否存在可执行文件。
不允许使用操作系统未提供的外部工具。所需的最小Windows版本是Windows XP。
答案 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
答案 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!
)