sor*_*rin 84 windows batch-file batch-processing
我正在寻找一种简单的方法来测试Windows批处理文件中的PATH环境变量中是否存在可执行文件.
不允许使用操作系统未提供的外部工具.所需的最小Windows版本是Windows XP.
Rya*_*ose 70
Windows Vista及更高版本附带一个程序where.exe,用于搜索路径中的程序.它的工作原理如下:
D:\>where notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe
D:\>where where
C:\Windows\System32\where.exe
Run Code Online (Sandbox Code Playgroud)
要在批处理文件中使用,您可以使用/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!
)
Run Code Online (Sandbox Code Playgroud)
或者是一个简单(但不太可读)的速记版本,可以打印消息并退出您的应用:
where /q myapplication || ECHO Cound not find app. && EXIT /B
Run Code Online (Sandbox Code Playgroud)
Joe*_*oey 68
for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
if defined FOUND ...
Run Code Online (Sandbox Code Playgroud)
如果你需要这个用于不同的扩展,只需迭代PATHEXT:
set FOUND=
for %%e in (%PATHEXT%) do (
for %%X in (myExecutable%%e) do (
if not defined FOUND (
set FOUND=%%~$PATH:X
)
)
)
Run Code Online (Sandbox Code Playgroud)
也许这where已经存在于旧版Windows上,但我无法访问,因此我无法分辨.在我的机器上,以下也有效:
where myExecutable
Run Code Online (Sandbox Code Playgroud)
如果找不到,则返回非零退出代码.但是,在批处理中,您可能还希望将输出重定向到NUL.
记住
批处理(.bat)文件和命令行中的解析不同(因为批处理文件具有%0- %9),因此您必须将其加倍%.在命令行上这不是必需的,因此对于变量而言%X.
ead*_*ter 18
这是一个简单的解决方案,尝试运行应用程序并在之后处理任何错误.
file.exe /? 2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path
Run Code Online (Sandbox Code Playgroud)
错误代码9009通常表示找不到文件.
唯一的缺点是,file.exe如果找到实际执行(在某些情况下是不可取的).
这可以通过参数替换来实现。
%~$PATH:1
Run Code Online (Sandbox Code Playgroud)
这将返回%1中可执行文件名的完整路径,否则返回一个空字符串。
这不适用于用户定义的变量。因此,如果可执行文件名不是脚本的参数,则需要一个子例程。例如:
call :s_which app.exe
if not "%_path%" == "" (
"%_path%"
)
goto :eof
:s_which
setlocal
endlocal & set _path=%~$PATH:1
goto :eof
Run Code Online (Sandbox Code Playgroud)
参见http://ss64.com/nt/syntax-args.html