Você precisará fazer algumas alterações para que funcione. Este exemplo como você deseja:
FOR /F "usebackq tokens=1-2" %i IN ('tasklist ^|findstr /b "[0-9]"') DO taskkill /PID %j
Seu código:
FOR /F "usebackq tokens=2 skip=2" %i IN ('tasklist |findstr /r "[0-9].exe") DO taskkill /PID %i
Por que seu código falhou:
- Em tempo de execução, a diretiva skip = 2 pulará seus dois primeiros resultados.
- A saída do Tasklist.exe tem várias colunas. Findstr.exe atua na primeira coluna, mas o Taskkill.exe usa o segundo. Sem incluir os dois, o Taskkill.exe não tem pid para agir.
- Seu conjunto (a cadeia entre os parênteses) deve ser delineado usando aspas (diretiva usebackq). Seu set não tem a cotação final de volta.
- O caractere | ou "pipe" é reservado. Você deve escapar com um caractere ^.
- O conjunto de expressões regulares que você passa para o Findstr.exe retornou para mim resultados não intencionais. Eu resolvi isso removendo o arquivo .exe e instruindo o Findstr.exe para procurar minha string no início do fluxo. Limitado desta forma, os meus resultados não incluem programas como o rundll32.exe que o seu conjunto incluía.
Você pode encontrar alguns excelentes exemplos de roteiros nos sites de Rob Vanderwoude e Timo Salmi: