1

我有一个问题要问你......希望有人能帮忙。

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

问题:我的批处理文件中有一些代码在寻找另一个进程并等待它结束......但是,这是在所有进程的 .exe 名称相同时编写的(在我们之前只是 PROGRAM.EXE转到 CLIENTNAME_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
4

2 回答 2

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

如果没有找到进程,继续

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

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

于 2014-10-23T15:23:46.947 回答
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
于 2015-02-24T17:37:35.527 回答