2014-10-23 3 views
1

У меня есть вопрос для ya'll ... надеюсь, кто-то может помочь.Убить процесс в пакетном файле, который соответствует определенному имени и пользователю

фона: у меня есть, позволяет сказать, 6 .exe-х, которые запускаются на 6 отдельных плановых заданий (с расширением .exe являются имени клиента и посмотреть, как это - CLIENTNAME_PROGRAM.EXE). Эти 6 задач выполняются под тремя отдельными учетными записями пользователей для целей планирования. Смысл, я могу одновременно запустить 2 процесса под разными учетными записями (вы не можете запускать их одновременно под одним ID). Если вы используете один идентификатор, вы должны запустить его, дождаться его окончания, а затем подождать следующего.

Проблема: У меня есть код в моем командном файле, который ищет другой процесс и ждет его окончания ... однако, это было написано, когда имя .exe было одинаковым для всех процессов (раньше это было просто PROGRAM.EXE, прежде чем мы перейдем к CLIENTNAME_PROGRAM.EXE). Проблема в том, что я только что понял, что моя переменная% TFProName% установлена ​​на имя клиента, который ПОСТОЯННО пытается запустить ... поэтому он не ищет, что любое другое TFProName работает под той же учетной записью компьютера, которая в настоящее время застряла. Имеет ли это смысл?

Итак, мне нужно:

Перед началом CLIENT2_PROGRAM под пользователя account1, поиск любого другого * процесса _PROGRAM работает под account1 и ждать его до конца. Если он длится долго, запустите сценарий 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 

ответ

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 
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 

Если ни один процесс не найден, продолжить

Если процесс найден, anotate его и увеличиваем счетчик цикла

Если достигнут предел, убить процесс еще подождать и повторить процесс

+0

Благодаря @MC ND. Я дам этому вихрь. Может потребовать меня через день или два из-за других вещей. Я ценю помощь! – Ilya

+0

Один вопрос @MC ND ... Я помещаю имя файла программы, пытающейся запустить (из этого скрипта) в process = spot? – Ilya

+0

@Ilya, нет, переменная процесса используется для хранения PID процесса (если он присутствует). Посмотрите на строку 'tasklist'. Есть две команды 'findstr', одна для фильтрации учетной записи пользователя и одна для фильтрации имени процесса (ну, вторая часть имени процесса из вашего вопроса) –