我有一个像这样的.bat文件程序
taskkill /f /im LearnBatV1.0.0.exe
timeout /t 1
start K:\POST\Govind\My Actual Work\LearnBat\LearnBatV1.0.0.exe
exit
LearnBatV1.0.0 是我创建的一个简单的应用程序。我运行该应用程序,然后运行 bat 文件。然后bat 文件将执行前两行,这将停止并关闭应用程序。但是当第三行尝试执行时,它显示错误
K: \ POST \ Govind \ My Actual Work \ LearnBat \ LearnBatV1.0.0.exe could not be found. Make sure you typed the name correctly and try
again.
它如何能够在第一行正确停止和关闭应用程序,但不能在第三行正确停止和关闭应用程序。地址100%正确。那为什么会报错呢。请帮助我。谢谢你。
我建议使用以下代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "LoopCount=6"
set "ForceKill="
:EndProgramLoop
%SystemRoot%\System32\tasklist.exe /NH /FI "IMAGENAME eq LearnBatV1.0.0.exe" | %SystemRoot%\System32\find.exe /I "LearnBatV1.0.0.exe" >nul || goto StartProgram
set /A LoopCount-=1
if %LoopCount% == 0 (
echo ERROR: Failed to terminate LearnBatV1.0.0.exe!
echo/
pause
goto EndBatch
)
if %LoopCount% == 1 set "ForceKill=/F "
%SystemRoot%\System32\taskkill.exe /IM LearnBatV1.0.0.exe %ForceKill%>nul 2>nul
%SystemRoot%\System32\timeout.exe /T 1 /NOBREAK >nul
goto EndProgramLoop
:StartProgram
start "" "K:\POST\Govind\My Actual Work\LearnBat\LearnBatV1.0.0.exe"
:EndBatch
endlocal
批处理文件首先检查
LearnBatV1.0.0.exe
是否正在运行。如果不是这种情况,它会启动可执行文件。
"
中包含的第一个参数字符串被解释为控制台窗口的标题字符串,即使启动的可执行文件是 Windows GUI 窗口,因此根本不会打开控制台窗口。因此,""
用于定义空标题字符串。由于空格字符,可执行文件的完全限定文件名也根据需要包含在 "
中。如果可执行文件是 Windows GUI 应用程序,我建议使用有意义的标题字符串。
我希望您的程序被编码为可以使用任何目录作为当前目录,因为
LearnBatV1.0.0.exe
的当前目录是由启动 cmd.exe
处理此批处理文件的进程定义的,因此可以是任何目录。
但是,如果
LearnBatV1.0.0.exe
确实正在运行,则首先将环境变量减一,计算结束程序的循环的执行频率,如果无法获得 LearnBatV1.0.0.exe
,则在循环中留下错误消息优雅地自我终止或最终被操作系统残酷地杀死。
已尝试四次通过 TASKKILL 向所有正在运行的进程 LearnBatV1.0.0.exe
发送
WM_CLOSE消息,这应该会导致可执行文件在代码不是很糟糕的情况下优雅地自行终止。最后使用选项
/F
强制操作系统残酷终止进程,作为最后一次尝试。
每次 TASKKILL 和 TASKLIST 执行之间都会延迟一秒,以便为进程提供优雅终止自身所需的时间。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
echo /?
endlocal /?
find /?
goto /?
pause /?
set /?
setlocal /?
start /?
taskkill /?
tasklist /?
timeout /?
另请参阅有关 使用命令重定向运算符 的 Microsoft 文档,了解
|
和 >nul
以及 2>nul
和 使用 Windows 批处理文件的单行多个命令,了解条件执行运算符 ||
.