Передача PID из списка задач и уничтожение процессов с помощью списка задач С пробелами в имени процесса

Так что этот вопрос очень похож на этот вопрос, с этим ответом. Но некоторые из моих процессов имеют пробел в имени, и CMD ничего не возвращает. На мой первоначальный вопрос ответили в этом ответе, этот вопрос спрашивает, как бы я это сделал, но с пробелами в имени процесса.

Код до сих пор:

FOR /F "usebackq tokens=1-10" %%i IN (`tasklist ^|findstr /b "nvsphelper64.exe"`) DO taskkill /F /PID %%j
FOR /F "usebackq tokens=1-10" %%i IN (`tasklist ^|findstr /b "nvcontainer.exe"`) DO taskkill /F /PID %%j
FOR /F "usebackq tokens=1-10" %%i IN (`tasklist ^|findstr /b "NVIDIA Share.exe"`) DO taskkill /F /PID %%j
pause

Я уже пробовал ставить ' вокруг NVIDIA Share.exeи я тоже пробовал ставить " вокруг, но он все равно игнорирует эту строку при выполнении.

(Я попытался выполнить как 32-битный exe-файл как администратор и как пакетный как администратор и без администратора, но безрезультатно.)

1 ответ

Решение

Кажется, есть некоторые недоразумения, как for /f работает в сочетании с обычным выводом списка задач и findstr.

> tasklist

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0          8 K
System                           4 Services                   0      4.896 K
...snip...

По умолчанию For /f разделитель - это пространство, и вы не меняете это.
Последовательные разделители считаются одним, а ведущие игнорируются.
Таким образом, чтобы получить PID в строке System Idle Process вы должны обратиться к токену 4 в следующей строке System PID является токеном 2.

Findstr OTOH по умолчанию работает в режиме RegEx, что означает, что искомые слова, разделенные пробелом, ORed - каждый соответствует независимо. Чтобы преодолеть это или обменять пространство между NVIDIA Share.exe с точкой, означающей любой символ - или переключиться на /C:"NVIDIA Share.exe" соответствовать буквально. (чтобы точно соответствовать буквальной точке в RegEx, вы должны экранировать ее обратной косой чертой.

Так что это должно работать для вас:

FOR /F "tokens=2" %%A IN ('tasklist ^|findstr /b "nvsphelper64\.exe" ') DO taskkill /F /PID %%A
FOR /F "tokens=2" %%A IN ('tasklist ^|findstr /b "nvcontainer\.exe"  ') DO taskkill /F /PID %%A
FOR /F "tokens=3" %%A IN ('tasklist ^|findstr /b "NVIDIA.Share\.exe" ') DO taskkill /F /PID %%A
pause
Другие вопросы по тегам