在批处理文件中杀死与特定名称和用户匹配的进程

时间:2014-10-23 14:01:10

标签: batch-file kill-process tasklist

我有一个问题,希望有人可以提供帮助。

背景:比方说,我有6个.exe由6个独立的计划任务启动(.exe以客户端命名,看起来像这样 - CLIENTNAME_PROGRAM.EXE)。这6个任务在3个独立的用户帐户下运行以进行调度。这意味着,我可以在不同的帐户下同时运行2个进程(您无法在一个ID下同时运行它们)。如果你使用一个ID,你必须运行一个,等待它结束,然后等待下一个。

问题:我的批处理文件中有一些代码,它会查找另一个进程并等待它结束...但是,这是在所有进程的.exe名称相同时编写的(在我们转到CLIENTNAME_PROGRAM.EXE之前,曾经只是PROGRAM.EXE)。问题是,我刚刚意识到我的%TFProName%变量被设置为当前正在尝试运行的客户端的名称...因此它不会查找在同一台计算机下运行的任何其他TFProName目前卡住的帐户。这有意义吗?

所以,我需要:

在用户ACCOUNT1下启动CLIENT2_PROGRAM之前,搜索在ACCOUNT1下运行的任何其他* _PROGRAM进程并等待它结束。如果运行时间很长,请运行powershell脚本来终止所述进程。

以下是我的代码段:

:PRVARCHSTART

tasklist /FI "IMAGENAME eq %TFProName%" | find /I "%TFProName%" >nul

IF ERRORLEVEL 1 (
   echo        **** %TIME% - Another archive process is not running...checking for an import/export          process... **** >> "%logfilefolder%\%logfilename%"
   goto PRVARCHEND
) ELSE (
   echo        **** %TIME% - Another archive is running...please wait...checking again... **** >>    "%logfilefolder%\%logfilename%"
   PING 1.1.1.1 -n 1 -w 5000 >nul
   powershell "& '%scriptdirectory%\KillTFProAdmin.ps1'"
   goto PRVARCHSTART
)
:PRVARCHEND

2 个答案:

答案 0 :(得分:0)

只测试tasklist输出中的任何行是否通过了两个过滤器,帐户和可执行文件。

    set "loop=0"
    set "loopLimit=2"
:PRVARCHSTART
    set "process="
    for /f "tokens=2 delims=," %%a in ('
        tasklist /v /fo:csv /nh ^| findstr /l /c:"%username%" ^| findstr /l /c:"_program.exe" 
    ') do (
        set /a "loop+=1"
        set "process=%%~a"
    )
    if not defined process goto :PRVARCHEND
    if %loop% geq %loopLimit% (
        taskkill /pid %process% /f
        goto :PRVARCHEND
    )
    ping -n 2 localhost >nul 2>nul
    goto :PRVARCHSTART
:PRVARCHEND

如果未找到任何流程,请继续

如果找到了进程,请对其进行旋转并增加循环计数器

如果达到限制,则终止进程,否则等待并重复该过程

答案 1 :(得分:0)

这是我现在使用的代码,效果很好:

    :PRVARCHSTART

tasklist /FI "IMAGENAME eq %TFProName%" | find /I "%TFProName%" >nul

IF ERRORLEVEL 1 (
   echo        **** %TIME% - Another archive process is not running...checking for an import/export          process... **** >> "%logfilefolder%\%logfilename%"
   goto PRVARCHEND
) ELSE (
   echo        **** %TIME% - Another archive is running...please wait...checking again... **** >>    "%logfilefolder%\%logfilename%"
   PING 1.1.1.1 -n 1 -w 5000 >nul
   powershell "& '%scriptdirectory%\KillTFProAdmin.ps1'"
   goto PRVARCHSTART
)
:PRVARCHEND