Передача 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, что означает, что искомые слова, разделенные пробелом, OR
ed - каждый соответствует независимо. Чтобы преодолеть это или обменять пространство между 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