Como posso mostrar o arquivo NAME de cada processo em execução a partir da linha de comando no Windows?

4

Eu queria saber como alguém pode obter o NOME de um arquivo se tiver o PID do processo em execução.

Diga se eu tenho 2 arquivos de texto notepad.exe em execução consecutiva e eu corro na linha de comando (código cortesia de: link ):

for /f "tokens=2 delims=," %F in ('tasklist /nh /fi "imagename eq notepad.exe" /fo csv') do @echo %~F

Eu obtenho o resultado:

6624 7124

Qual nome do arquivo de texto é PID 6624? ou Qual nome do arquivo de texto é PID 7124?

diz que o PID 6624 é 'findme1.txt' e o PID 7124 é findme2.txt '

Eu não sei qual dos processos PID para MATAR.

Eu posso matar o processo errado e perder informações vitais ...

Em outras palavras: qual dos arquivos findme * .txt acima é findme1.txt e qual dos arquivos findme * .txt acima é findme2.txt?

Eu só desejo matar findme1.txt e NOT findme2.txt, que contém informações vitais sobre o sistema, por exemplo.

Qualquer sugestão será muito bem-vinda e apreciativa por mim. Muito obrigado antecipadamente.

    
por dzur 11.03.2016 / 02:16

1 resposta

0

O que você procura é o nome do arquivo em que cada processo está trabalhando - se houver.

plano de fundo

O problema é que o nome do arquivo sendo trabalhado (ao contrário do nome do arquivo executável) normalmente não é exibido na saída da lista de tarefas ou na saída de qualquer outra ferramenta de linha de comando padrão que conheço.

Um processo sempre tem uma lista interna dos arquivos abertos - eles estão no processo "manipula tabela". Isto é visível em, e. Process Explorer, mas você quer uma ferramenta de linha de comando. E não há uma maneira geral de saber, entre todos os arquivos que um processo abriu, qual é o documento que o processo é aberto para edição.

No entanto. Alguns aplicativos, incluindo o Notepad, o pacote Office e muitos outros, definem o nome do arquivo no título da janela. por exemplo. "Notepad file1.txt" Isto não está em uma forma consistente de um aplicativo para outro. Um aplicativo pode definir o título de suas janelas para qualquer coisa que desejar. Um programa poderia, por exemplo, colocar seu próprio nome primeiro e depois o nome do arquivo. Tanto faz.

Então, você quer ver os títulos das janelas. O Gerenciador de Tarefas pode mostrar títulos de janela, mas você quer uma ferramenta de linha de comando. Como observa JosefZ, tasklist / v pode fazer isso. (Há também um pequeno programa chamado tlist que o fará. Ele vem com o pacote Windows Debugging Tools.) No entanto, eles mostrarão a você, além dos processos que você deseja, um monte de processos que não possuem nomes de janelas. .

resposta

PowerShell para o resgate! Tente isto no seu prompt de comando: (Você não precisa estar em c: \, isso é apenas um exemplo)

c:\> powershell -command "get-Process | where-Object {$_.mainWindowTitle} | format-table id,name,mainwindowtitle -AutoSize"

Isso listará todos os processos que possuem um título de janela não vazio.

Se você quiser apenas ver processos executando um programa em particular - como o bloco de notas - você pode colocar esse nome antes do primeiro canal, assim:

c:\> powershell -command "get-Process notepad | where-Object {$_.mainWindowTitle} | format-table id,name,mainwindowtitle -AutoSize"

Isso filtra a saída de get-Process antes que ele atinja o restante dos comandos. o comando where-Object filtra para títulos de janelas não vazios, e a tabela de formatos apenas coloca o resultado em uma tabela limpa.

Agora, vamos tornar isso mais fácil. Coloque o seguinte em um arquivo .cmd, digamos que você o chame de wn.cmd (wn for windowname). Coloque o wn.cmd em algum diretório que esteja no seu caminho. (Eu sempre crio um diretório chamado c: \ progs e adiciono isso ao meu caminho, para pequenas coisas como essa. Eu também coloco as ferramentas sysinternals nesse diretório.)

c:\> @echo off
c:\> powershell -command "get-Process %1 | where-Object {$_.mainWindowTitle} | format-table id,name,mainwindowtitle -AutoSize"

exemplos

Agora, em um prompt de comando ... assumindo que wn.cmd esteja em algum lugar em seu caminho ... você pode simplesmente digitar

c:\> wn

e você obterá a lista completa de processos com janelas nomeadas ... assim:

   Id Name           MainWindowTitle
   -- ----           ---------------
 9596 chrome         How can I show the file NAME of each running process from the command-line in Windows? - Super ...
11980 cmd            Command Prompt - wn
10164 explorer       progs
10180 Horas          Horas - Fri 11
 2520 notepad        windownames.ps1 - Notepad
15348 notepad        notes2.txt - Notepad
 8304 OUTLOOK        Inbox - mailbox - Outlook
17312 powershell_ise Windows PowerShell ISE
 6140 TTool103       Alarm

e se você digitar, por exemplo

c:\> wn notepad

você recebe apenas os que estão executando o bloco de notas:

   Id Name    MainWindowTitle
   -- ----    ---------------
 6240 notepad Untitled - Notepad
13096 notepad wn.cmd - Notepad
15348 notepad notes2.txt - Notepad

(Esta seleção atende pelo nome do executável, não pelo título da janela.)

Crédito para onde o crédito é devido: Encontrei o "script" original do powershell para listar processos com janelas nomeadas de esta página em powershell.com . Embalá-lo em um arquivo .cmd só facilita o uso.

    
por 11.03.2016 / 09:46