如何使用 cmd / powershell 对文件夹中的所有程序执行 taskkill
Posted
技术标签:
【中文标题】如何使用 cmd / powershell 对文件夹中的所有程序执行 taskkill【英文标题】:how to do taskkill for all programs in the folder using cmd / powershell 【发布时间】:2021-12-31 09:25:30 【问题描述】:我想对带有cmd
/ powershell
的文件夹中的所有以exe
结尾的程序执行Taskkill
例子
taskkill /f /im C:\folder\*.exe
【问题讨论】:
你不能这样使用taskkill.exe
,因为/IM
\IMAGENAME
就是这样;带有文件扩展名的基本名称。您可以首先解析“文件夹”以获取“文件夹”中所有 .exe
文件的基本名称,然后通过 taskkill
命令实用程序迭代每个文件,但您必须确定没有其他任务已经在其他位置运行的相同名称的文件,(因为您也会“杀死”这些文件)。
请允许我给你一个标准的建议给新手:如果你accept 一个答案,你将帮助未来的读者,向他们展示解决了你的问题的方法。要接受答案,请单击答案左侧大数字下方的大 ✓ 符号(您将获得 2 点声望)。如果您至少有 15 个声望点,您还可以投票给其他有用的答案(也可以选择接受的答案)。如果您的问题尚未解决,请提供反馈,或者,如果您自己找到了解决方案,请self-answer。
【参考方案1】:
在 PowerShell 中,类似这样:
$files = gci "C:\Path\To\Files" -Filter "*.exe"
foreach($file in $files)
Get-Process |
Where-Object $_.Path -eq $file.FullName |
Stop-Process -WhatIf
当您确信正确的进程会停止时,删除 -WhatIf。
【讨论】:
很好,行继续的反引号是多余的,我已经删除了它们。我包括了可执行文件的过滤器,因为这是提问者的要求;虽然我的实现当然可以简化,但我觉得这种格式提供了一些清晰度。需要注意的是,并非所有进程都有以 exe 结尾的文件路径。 感谢更新。是的,将进程限制为来自给定目录的可执行文件是一项要求,但我的意思是,您可以通过过滤Get-Process
输出的.Path
属性的目录的对象直接实现这一目标 path 是感兴趣的目录路径。这也避免了担心哪些文件扩展名是可执行的。 (据我所知,只有.com
和.exe
是直接 可执行的,导致进程以文件的基本名称命名;在$env:PATH_EXT
中列出的具有其他扩展名的文件被执行间接。)
我同意在几乎所有情况下按照您的建议过滤 Get-Process 输出都可以,但不是全部。例如,执行我的回答中的代码来杀死 Docker Desktop.exe,而不过滤 exe 文件,会尝试杀死 Docker Desktop.exe 和 com.docker.service 进程。
有趣。 com.docker.service
的基础是什么可执行文件,为什么它会位于 C:\folder
?相反,如果它位于那里,则根据问题的前提,它应该被杀死(尽管这可能会失败,除非被提升)。
我相信com.docker.service
进程是,或者可以通过net.exe启动;本质上,它是作为 Windows 进程运行的 Docker 服务。如果意图终止 Docker 桌面客户端,我认为尝试终止服务是不合理的。当然,Docker 可能不会安装到C:\folder
,但我将该目录作为占位符。【参考方案2】:
我建议您尝试不同的内置命令实用程序,WMIC.exe
:
%SystemRoot%\System32\wbem\WMIC.exe Process Where "ExecutablePath Like 'P:\\athTo\\Folder\\%'" Call Terminate 2>NUL
只需根据需要更改P:\\athTo\\Folder
,记住每个反斜杠都需要加倍。 您可能对“文件夹”名称中的其他字符有困难,但这些超出了我的回答范围。要了解更多信息,请阅读LIKE Operator
注意:如果您从batch-file 运行命令,而不是直接在cmd 内运行,请将%
字符更改为%%
【讨论】:
在可预见的未来肯定不是问题,但值得注意的是 WMIC 工具一直是deprecated。 正是@nimizen!在可预见的未来不是问题......我们可以为taskkill.exe
和许多其他内置命令行实用程序发表声明,(虽然没有显示消息说它们已被弃用),其中许多本质上是在执行现在可以通过powershell.exe
执行的任务。虽然我们可以说内置 PowerShell powershell.exe
在技术上已被弃用,取而代之的是 PowerShell Core,即 pwsh.exe
。
(要明确:你有我的 +1 以获得简洁的解决方案。wmic.exe
表明如果你运行 wmic /?
(第一个非空行),它已被弃用)。考虑弃用逻辑直至其本地结论:在 PowerShell(两个版本)中,使用 Get-CimInstance
,它将继续在 PowerShell(Core)7+ 中工作:Get-CimInstance win32_Process -Filter "ExecutablePath Like 'P:\\athTo\\Folder\\%'" | Invoke-CimMethod -MethodName Terminate -WhatIf
来自cmd.exe
,使用wmic.exe
是唯一合理的解决方案。但是,从 PowerShell 中,可以使用不需要深入研究 CIM/WMI 的查询语言和方法调用的解决方案,只使用 Get-Process
和 Stop-Process
cmdlet,顺便说一句,这也使解决方案工作在类 Unix 平台上(OP 未要求)。
* 我的意思是 logical 结论,而不是 local。还需要注意的是,并非 所有 命令行实用程序都已弃用,因为 PowerShell also 提供了具有相同功能的 cmdlet。大多数都不被弃用,包括taskkill.exe
。 wmic.exe
显然已有选择地、明确地弃用,尽管我不清楚其背后的原因。【参考方案3】:
nimizen's helpful PowerShell answer有效,但可以简化:
Get-Process |
Where-Object (Split-Path -Parent $_.Path) -eq 'C:\folder' |
Stop-Process -WhatIf
注意:上面命令中的-WhatIf
common parameter预览操作。一旦您确定该操作会执行您想要的操作,请删除 -WhatIf
。
注意:
以上仅针对其可执行文件直接在C:\folder
中的进程,通过检查(直接)父路径(封闭目录)是否是感兴趣的路径,使用Split-Path
@987654333 @。
如果您想以递归方式定位位于C:\Folder
及其任何子文件夹中的可执行文件,请使用以下内容(在Where-Object
的脚本块中( ...
):
$_.Path -like 'C:\folder\*'
与Compo's helpful wmic.exe
-based answer[1] 不同,此答案的解决方案也适用于类似 Unix 的平台(使用 PowerShell (Core) 7+)。
[1] 从技术上讲,wmic.exe
已弃用,wmic /?
以红色打印 WMIC is deprecated
作为第一行(非空)就证明了这一点。考虑改用 PowerShell 的 CIM cmdlet,例如 Get-CimInstance
,它具有返回对象而不是文本的额外优势,以实现稳健的后续处理。
【讨论】:
以上是关于如何使用 cmd / powershell 对文件夹中的所有程序执行 taskkill的主要内容,如果未能解决你的问题,请参考以下文章
如何调试混合 cmd 和 powershell 脚本以解决特殊字符问题,如 & 和
如何编写使用 powershell 而不是 cmd 的控制台应用程序
通过管道将 CMD 输出传递给 Powershell [重复]