taskkill - finaliza tarefas com títulos de janelas que terminam com uma string específica

5

Eu preciso escrever um programa em lotes para terminar todas as tarefas do comunicador do MS Office com títulos de janela (normalmente terminando com o padrão "- Conversação".

Eu tentei

taskkill /FI "WINDOWTITLE eq *Conversation" /IM communicator.exe

mas o padrão curinga que começa com um '*' não parece funcionar. Dá o seguinte erro

ERROR: The search filter cannot be recognized.

qualquer sugestão para uma solução alternativa seria muito apreciada!

    
por dbza 10.12.2012 / 18:03

2 respostas

2

Aqui está um arquivo em lote parcialmente inspirado por esta pergunta por Rogier:

@echo off

for /F "delims=" %%a in ('tasklist /fo list /v') do (
      call :Sub %%a
)
exit /b
 

:Sub
set Line=%*
set BOL4=%Line:~0,4%
set BOL13=%Line:~0,13%
set Value=%Line:~14%
if "%BOL4%"=="PID:" (
      set save_PID=%Value%
      exit /b
)
if "%BOL13%"=="Window Title:" (                          // Note . below.
      echo %Value% | findstr /r /c:"- Conversation.$" > nul
      if not errorlevel 1 (
            echo %save_PID%
            REM taskkill /pid %save_PID%
      )
      exit /b
)
exit /b

Descobri que precisava adicionar um . no final da expressão regular para o

echostring| findstr /rregular expression ending with $

forma de trabalhar. Eu estou supondo que echo está adicionando um CR ou talvez um CRLF extra à string , e que findstr está contando isso como um caractere ocorrendo entre a string e o final da linha.

Obviamente você irá descomentar o comando taskkill que você testou isso.

    
por 11.12.2012 / 01:46
3

Eu aprecio a resposta do arquivo em lote que usa um comando FOR.

Aqui está outro método, apresentado aqui simplesmente como uma opção adicional. A abordagem é bastante diferente da outra resposta que é fornecida.

Primeiro, veja se você pode encontrar os processos do MS Communicator com o WMIC. por exemplo:

WMIC PROCESS LIST FULL

Ou, para mostrar informações horizontalmente em uma tabela em vez de verticalmente no formato Property = Value, faça:

WMIC PROCESS LIST FULL /FORMAT:TABLE

ou talvez, para limitar isso:

WMIC PROCESS GET NAME /FORMAT:TABLE

(e ignore a primeira linha)

Isso não parece mostrar o título da janela, mas pode mostrar muitas outras informações que podem ser usadas para identificar de forma exclusiva as instâncias do Communicator, como nomes executáveis.

Depois, você pode começar a ficar mais agressivo, restringindo suas descobertas. A seguir, há instâncias que terminam com "name.exe" (por exemplo, "filename.exe", "myname.exe")

WMIC PROCESS WHERE "Description like '%%name.exe'" LIST FULL /FORMAT:TABLE

Tudo isso foi apenas pesquisa para ajustar seu comando. (Afinal, você não quer realmente começar a finalizar os processos errados.)

Finalmente, depois que toda a sua pesquisa estiver concluída, você saberá que pode listar apenas as coisas que deseja encerrar e começar a matar.

WMIC PROCESS WHERE "Description like '%%name.exe'" DELETE

A parte realmente interessante desse método é que você encontra rapidamente maneiras de coletar muitas informações que podem ser usadas para automação.

    
por 06.01.2015 / 11:10