从 tasklist 传递 PID,并使用 tasklist 终止进程,且进程名称中带有空格

从 tasklist 传递 PID,并使用 tasklist 终止进程,且进程名称中带有空格

所以这个问题和这个问题, 和这个答案。但我的一些进程名称中有空格,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对于如何与正常 tasklist 输出和 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,在下一行中,SystemPID 是标记 2。

另一方面,Findstr 默认在 RegEx 模式下工作,这意味着搜索词被空格分隔OR- 每个词都独立匹配。为了解决这个问题,要么用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

相关内容