【问题标题】:Kill process in batch file that matches certain name and user杀死与特定名称和用户匹配的批处理文件中的进程
【发布时间】:2014-10-23 14:01:09
【问题描述】:

我有一个问题要问你们......希望有人能提供帮助。

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

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

所以,我需要:

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

下面是我的代码sn-p:

: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

【问题讨论】:

    标签: batch-file kill-process tasklist


    【解决方案1】:

    只需测试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
    

    如果没有找到进程,继续

    如果找到进程,则对其进行注释并增加循环计数器

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

    【讨论】:

    • 感谢@MC ND。我会试一试。由于发生其他事情,可能需要一两天时间。感谢您的帮助!
    • 一个问题@MC ND...我是否将尝试运行的程序的文件名(来自此脚本)放在 process=spot 中?
    • @Ilya,不,进程变量用于存储进程的 PID(如果存在)。看看tasklist 行。有两个findstr 命令,一个用于过滤用户帐户,一个用于过滤进程名称(嗯,来自您问题的进程名称的第二部分)
    • 哦,好吧...所以我实际上并没有更改脚本中的任何内容。我以为你留下什么东西让我填写变量。明白了。
    • @Ilya,如果您的问题中的样本不匹配,我认为您唯一需要更改的是将_program.exe 更改为流程的第二部分名称。
    【解决方案2】:

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

        :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
    

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2012-10-22
      • 2021-12-05
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多