从批处理文件完成后如何终止整个进程
how do i kill an entire process after its finished from a batch file
我希望在完成后终止整个进程。我的问题是,我不知道这个过程可能需要多长时间。可能需要 2 分钟,也可能需要 1.5 小时才能完成。完成后,弹出两个windows,我必须点击"OK"。因为我想自动化进程,所以我想完全终止进程,以便它执行 .bat 文件中的下一步。
这是我目前在下面的 .bat 文件中得到的内容。 AutoIT和AHK解决方案也欣然接受。请注意*** 主应用程序 window 和弹出窗口 windows 具有相同的名称,即 "AutoMe"。
@echo off
:: this is the long running process
am -a arobot
:: I was hoping this would kill the process but it just gets stuck with a
:: messagebox
taskkill /F /IM am.exe
:: Next step to perform
sqlldr XXXXXX
pause
在后台启动进程并等待具有指定标题的 window Some Window Title
:
@echo off
start "" /b am -a arobot
:wait
timeout 1 >nul
for /f "tokens=2" %%a in ('
tasklist /fi "windowtitle eq Some Window Title" /fo list ^| find "PID:"
') do (
taskkill /f /pid %%a
goto next
)
goto wait
:next
sqlldr XXXXXX
pause
这里有两个 AutoIt 解决方案。
如果您在终止进程之前不需要单击两个确定按钮。
While 1
Sleep(250)
If WinExists("Title of the window with the OK button") Then ExitLoop
WEnd
;Close process. Make sure that am.exe is the process name.
ProcessClose("am.exe")
如果您需要在终止进程之前单击两个确定按钮。
While 1
Sleep(250)
If WinExists("Title of the window with the OK button") Then ExitLoop
WEnd
$hWnd = WinGetHandle("Title of the window with the OK button")
WinActivate($hWnd)
WinWaitActive($hWnd)
ControlClick("My Window", "", "[CLASS:Button; TEXT:OK; INSTANCE:1]") ;<<<check to make sure you have the right button control
WinWait("title of second window")
$hWnd = WinGetHandle("title of second window")
WinActivate($hWnd)
WinWaitActive($hWnd)
ControlClick("My Window", "", "[CLASS:Button; TEXT:OK; INSTANCE:1]") ;<<<check to make sure you have the right button control
;Close process. Make sure that am.exe is the process name.
ProcessClose("am.exe")
当弹出 window 与主 window 同名时,您可以在 window 中查找确定按钮控件或任何其他控件,而不是 window标题。
While 1
Sleep(250)
If ControlCommand("win title", "", "[CLASS:Button; TEXT:OK; INSTANCE:1]", "IsVisible", "") = 1 Then ExitLoop
WEnd
另一种方法是检查 window 句柄。当您使用 WinGetHandle 并且有两个同名的 windows 时,它将获得最近活动的 window 的句柄。在您的情况下,您可以使用此功能查看弹出窗口 window 何时出现。
$hWnd = WinGetHandle("Window title")
While 1
Sleep(250)
If $hWnd <> WinGetHandle("Window title") Then ExitLoop
WEnd
您可以使用 AutoIt Window Information Tool 查找控件和 window 标题。
我希望在完成后终止整个进程。我的问题是,我不知道这个过程可能需要多长时间。可能需要 2 分钟,也可能需要 1.5 小时才能完成。完成后,弹出两个windows,我必须点击"OK"。因为我想自动化进程,所以我想完全终止进程,以便它执行 .bat 文件中的下一步。
这是我目前在下面的 .bat 文件中得到的内容。 AutoIT和AHK解决方案也欣然接受。请注意*** 主应用程序 window 和弹出窗口 windows 具有相同的名称,即 "AutoMe"。
@echo off
:: this is the long running process
am -a arobot
:: I was hoping this would kill the process but it just gets stuck with a
:: messagebox
taskkill /F /IM am.exe
:: Next step to perform
sqlldr XXXXXX
pause
在后台启动进程并等待具有指定标题的 window Some Window Title
:
@echo off
start "" /b am -a arobot
:wait
timeout 1 >nul
for /f "tokens=2" %%a in ('
tasklist /fi "windowtitle eq Some Window Title" /fo list ^| find "PID:"
') do (
taskkill /f /pid %%a
goto next
)
goto wait
:next
sqlldr XXXXXX
pause
这里有两个 AutoIt 解决方案。
如果您在终止进程之前不需要单击两个确定按钮。
While 1
Sleep(250)
If WinExists("Title of the window with the OK button") Then ExitLoop
WEnd
;Close process. Make sure that am.exe is the process name.
ProcessClose("am.exe")
如果您需要在终止进程之前单击两个确定按钮。
While 1
Sleep(250)
If WinExists("Title of the window with the OK button") Then ExitLoop
WEnd
$hWnd = WinGetHandle("Title of the window with the OK button")
WinActivate($hWnd)
WinWaitActive($hWnd)
ControlClick("My Window", "", "[CLASS:Button; TEXT:OK; INSTANCE:1]") ;<<<check to make sure you have the right button control
WinWait("title of second window")
$hWnd = WinGetHandle("title of second window")
WinActivate($hWnd)
WinWaitActive($hWnd)
ControlClick("My Window", "", "[CLASS:Button; TEXT:OK; INSTANCE:1]") ;<<<check to make sure you have the right button control
;Close process. Make sure that am.exe is the process name.
ProcessClose("am.exe")
当弹出 window 与主 window 同名时,您可以在 window 中查找确定按钮控件或任何其他控件,而不是 window标题。
While 1
Sleep(250)
If ControlCommand("win title", "", "[CLASS:Button; TEXT:OK; INSTANCE:1]", "IsVisible", "") = 1 Then ExitLoop
WEnd
另一种方法是检查 window 句柄。当您使用 WinGetHandle 并且有两个同名的 windows 时,它将获得最近活动的 window 的句柄。在您的情况下,您可以使用此功能查看弹出窗口 window 何时出现。
$hWnd = WinGetHandle("Window title")
While 1
Sleep(250)
If $hWnd <> WinGetHandle("Window title") Then ExitLoop
WEnd
您可以使用 AutoIt Window Information Tool 查找控件和 window 标题。