из командного файла, как мне ждать завершения процесса после вызова taskkill.exe? - PullRequest
1 голос
/ 22 октября 2011

Я хочу написать командный файл, который обновляет библиотеку DLL, которая используется запущенным процессом, обычным приложением.

Для этого планируется остановить процесс, скопировать DLL в нужное место, а затем перезапустить процесс.

Я знаю, что могу попытаться убить процесс с помощью taskkill.Как я могу убедиться, что процесс упал и умер после того, как я его снимал?

1 Ответ

3 голосов
/ 22 октября 2011

Вот что я использовал.Это подпрограмма в командном файле.

set tasklist=%windir%\System32\tasklist.exe
set taskkill=%windir%\System32\taskkill.exe

-------------------------------------------------------
:STOPPROC
    set wasStopped=0
    set procFound=0
    set notFound_result=ERROR:
    set procName=%1
    for /f "usebackq" %%A in (`%taskkill% /IM %procName%`) do (
      if NOT %%A==%notFound_result% (set procFound=1)
    )
    if %procFound%==0 (
      echo The process was not running.
      goto :EOF
    )
    set wasStopped=1
    set ignore_result=INFO:
:CHECKDEAD
    "%windir%\system32\timeout.exe" 3 /NOBREAK
    for /f "usebackq" %%A in (`%tasklist% /nh /fi "imagename eq %procName%"`) do (
      if not %%A==%ignore_result% (goto :CHECKDEAD)
    )
    goto :EOF
-------------------------------------------------------

Чтобы использовать его из командного файла, сделайте так:

  call :STOPPROC notepad.exe

Полный пример:

set tasklist=%windir%\System32\tasklist.exe
set taskkill=%windir%\System32\taskkill.exe

-------------------------------------------------------
:STOPPROC
    set wasStopped=0
    set procFound=0
    set notFound_result=ERROR:
    set procName=%1
    for /f "usebackq" %%A in (`%taskkill% /IM %procName%`) do (
      if NOT %%A==%notFound_result% (set procFound=1)
    )
    if %procFound%==0 (
      echo The process was not running.
      goto :EOF
    )
    set wasStopped=1
    set ignore_result=INFO:
:CHECKDEAD
    "%windir%\system32\timeout.exe" 3 /NOBREAK
    for /f "usebackq" %%A in (`%tasklist% /nh /fi "imagename eq %procName%"`) do (
      if not %%A==%ignore_result% (goto :CHECKDEAD)
    )
    goto :EOF
-------------------------------------------------------

:MAIN 

call :STOPPROC notepad.exe
call :STOPPROC Skype.exe

Вы заметите строки, которые имеютвсе тире - это, конечно, неправильный синтаксис для командного файла.Но эти строки никогда не достигаются из-за использования операторов GOTO, поэтому синтаксис никогда не оценивается.Поэтому эти строки не являются проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...