Como obter o comando que invocou uma tarefa com lista de tarefas?

18

O gerenciador de tarefas do Windows possui uma coluna chamada Linha de Comando que mostra o comando que iniciou a tarefa especificada, com todas as opções e parâmetros, por exemplo:

test.exe -V -A 127.0.0.1 -P 6062

Agora eu tenho que identificar uma determinada tarefa que está escutando em uma determinada porta e / ou foi chamada com uma certa combinação de switches. Meu objetivo é fechar a tarefa selecionada, mas não outras, portanto, se houver várias test.exetarefas em execução, não posso simplesmente fechar todas as tarefas retornadas por:

tasklist /fo csv /nh /fi "imagename eq test.exe"

Infelizmente, parece que nem tasklistnem pslist( aqui ) é capaz de retornar o campo Linha de Comando . Como posso superar esse problema?

István Zachar
fonte
Talvez você possa fazer algo com netstat -aon | grep \.0:6062a porta 6062 e a última coluna seja o PID do seu programa. Não tenho certeza se isso é suficiente para você. tasklist /FI "PID eq <PID>"daria o seu executável novamente.
Rik
@Rik Infelizmente, isso não é suficiente, pois a porta em si não é suficiente para identificar a tarefa correta, por isso é necessário ver também os argumentos da linha de comando.
István Zachar 2/13/13
Não consigo imaginar vários programas ouvindo na mesma porta ... :) Mas deve ser possível obter os parâmetros ... process explorerda Sysinternals pode mostrá-los na GUI. Portanto, a informação deve estar em algum lugar.
Rik
Você usa para um comando do PowerShell? Like <<< Get-WmiObject win32_process -Filter "nome como '% test.exe'" | selecione CreationDate, ProcessId, CommandLine | ft -AutoSize` >>> Veja aqui
Rik
@Rik, é claro que a porta é diferente, mas preciso extrair os argumentos da linha de comando também para verificar se a tarefa é a única que preciso matar.
István Zachar

Respostas:

35

Que tal este:

wmic process where caption="test.exe" get commandline

E se você fizer isso, também receberá o ProcessId:

wmic process where caption="test.exe" get commandline,processid

wmictambém tem uma opção para enviar para CSV. Então:

wmic /output:c:\temp\proc.csv process where caption="test.exe" get commandline,processid /format:csv

Nota: Se você receber um erro com o último ( Invalid XSL format (or) file name), precisará copiar csv.xmlde %WINDIR%\System32\wbem\en-USpara %WINDIR%\System32\wbem. Você pode ler sobre esse bug aqui .


Você também pode usar o PowerShell:

Get-WmiObject win32_process -Filter "name like '%test.exe'"|select CreationDate,ProcessId,CommandLine|ft -AutoSize`
Rik
fonte
Obrigado, é isso, wmicresolve o problema, e isso conclui o dia. :)
István Zachar
1
Perfeito - isso realmente fornece a linha de comando completa. No gerenciador de tarefas, ele mostra apenas os primeiros 300 caracteres ou mais.
ArtOfWarfare