如何使用 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-ProcessStop-Process cmdlet,顺便说一句,这也使解决方案工作在类 Unix 平台上(OP 未要求)。 * 我的意思是 logical 结论,而不是 local。还需要注意的是,并非 所有 命令行实用程序都已弃用,因为 PowerShell also 提供了具有相同功能的 cmdlet。大多数都被弃用,包括taskkill.exewmic.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的主要内容,如果未能解决你的问题,请参考以下文章

powershell中如何执行bat文件

如何调试混合 cmd 和 powershell 脚本以解决特殊字符问题,如 & 和

如何编写使用 powershell 而不是 cmd 的控制台应用程序

通过管道将 CMD 输出传递给 Powershell [重复]

Win10 cmd/PowerShell SSH无法创建目录 和 SCP 找不到文件

我如何在 Windows 中使用 cmd/powershell 卸载受密码保护的应用程序 [关闭]