Kill processo baseado no caminho para a imagem

1

Eu herdei um ambiente no qual dois processos diferentes usam nomes idênticos, mas seus arquivos executáveis são armazenados em diferentes caminhos de arquivo. Nenhum, um, o outro ou ambos podem estar em execução a qualquer momento.

Quando executo certas operações (como patch), quero que o processo associado ao diretório de patch seja encerrado, mas não o outro.

Usando uma variedade de técnicas diferentes, não tenho problemas para finalizar os processos com base no nome do processo, como (menos elegantemente sem usar o powershell):

echo Checking for procname process...
tasklist /FI "IMAGENAME eq procname .exe" | !windir!\system32\find /I "procname.exe" 
set EL=!ERRORLEVEL!
if !EL! EQU 0 (
    echo Killing procname process...
    TASKKILL /F /FI "IMAGENAME eq procname.exe"
)

ou mais elegantemente (usando o powershell)

powershell Clear-Host 
powershell Stop-Process -name procname

No entanto, esses dois métodos eliminam os dois processos se estiverem em execução.

Em vez de eliminar esses processos com base no nome do processo, como posso matar um processo baseado no caminho para o executável?

    
por Jim2B 14.03.2016 / 18:38

1 resposta

0

Eu encontrei uma maneira de fazer o que eu queria e pensei em compartilhar a solução.

Esta solução requer o powershell.

powershell Get-Process <ProcessName> ^| Where-Object {$_.Path -like '*<path_fragment>*'} ^| Stop-Process

** o "^ |" tubos são necessários para manter os tubos dentro do intérprete powershell. Usar um pipe normal ("|") parece redirecioná-lo ao interpretador de comandos normal e interrompe o comando.

Para colocar alguns valores reais por trás deste código, assuma que o processo para matar é o Notepad ++:

powershell Get-Process notepad++ ^| Where-Object {$_.Path -like '*Notepad++*'} ^| Stop-Process

Isso pode ser invocado em uma linha de comando a partir de um arquivo em lote (o que é minha intenção).

Se os usuários puderem ver a saída do comando acima, coloque um redirecionamento stderr para nul no final da linha. Quando o Get-Process não encontra algo, emite o que parece ser um erro bastante grave - mas é realmente apenas sua maneira de dizer "não encontrei nada".

    
por 14.03.2016 / 20:07