Назад | Перейти на главную страницу

Передайте 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 как администратор и как пакет как администратор и без администратора, но безрезультатно.)

Кажется, есть недопонимание, как 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