如何通过批处理文件从特定文件夹中终止正在运行的进程

3
我正在编写一个卸载批处理文件,但有时由于运行进程而无法删除文件夹。是否有一种方法可以终止驻留在特定文件夹中的所有运行进程。请注意,可能会有多个子文件夹中运行的进程。因此,我认为它需要搜索正在运行的进程,并强制且静默地终止所有在"C:\Program Files\PTC"或其子文件夹中驻留的进程。
我知道如何使用"Taskkill"命令终止特定进程,但查找并终止文件夹内的所有运行进程有些超出了我的能力范围。
提前感谢您的帮助。
比尔

杀死进程 ==> 看一下这个如何停止使用Eclipse外部工具配置启动的进程 - Hackoo
谢谢提供链接。我的问题是可能有多个进程正在运行,它们位于“C:\Program Files\PTC”中。我需要能够查询正在运行的进程并在删除“PTC”文件夹之前杀死“所有”正在运行的进程。或者,如果可能的话,另一个选项是查询包含ptc的描述的运行进程,然后在删除“ptc”文件夹之前杀死它们。 - Bill
5个回答

1

批处理不适合这个问题,正如你在之前的答案中看到的那样。终止线被注释掉了'字符。

这是VBS。

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")

For Each objItem in colItems
'    If Instr(objItem.ExecutablePath, "C:\Program Files") > 0 Then objItem.terminate
    If Instr(objItem.ExecutablePath, "C:\Program Files") > 0 Then msgbox objItem.name
Next

你可以使用WMIC来获取帮助,因为它们使用相同的对象。
wmic /?
wmic process /?
wmic process call /?
wmic process get /?

感谢提供的代码。最终我将其放入了一个vbs脚本中,并从我的批处理文件中调用了这个vbs脚本。我尝试了多种方法将其嵌套在批处理文件中,但是无法执行并关闭我的命令窗口。 - Bill

1
通过批处理文件获取有关进程最全面信息的方法是使用WMIC命令。虽然它不包含工作目录,所以您可能需要通过命令行来定位自己。 请检查下面脚本中的注释。首先用您想要的路径替换workdir变量,如果进程看起来正常,请取消最后一行的注释。您可以精确指定:
@echo off

:: Put the work dir here
set "workdir=C:\Windows\system32"
set "workdir=%workdir:\=\\%"

setlocal enableDelayedExpansion
for /f "usebackq tokens=* delims=" %%a in (`
    wmic process  where 'CommandLine like "%%!workdir!%%" and not CommandLine like "%%RuntimeBroker%%"'   get CommandLine^,ProcessId  /format:value
`) do (
    for /f "tokens=* delims=" %%# in ("%%a")  do (
        if "%%#" neq "" (
            echo %%#
            set "%%#"
        )
    )
)

rem if the echoed process looks ok unocment line bellow

rem taskkill /pid %ProcessID% /f

%% 是在 wmic 查询中的通配符,可以更精确地选择。请注意,第二部分不像(仅为示例)。这里有关于WQL的更多信息。


1
我会使用 ExecutablePath like "%%!workdir!%%" 而不是 CommandLine like "%%!workdir!%%",因为 CommandLine 可能只有部分匹配……并将 rem taskkill … 移至 for … %%# 循环内。 - JosefZ

1
下面是由npocmaka改进后的脚本版本,你也可以从closeapps.cmd下载该脚本。
@echo off

if "%1"=="" goto help

:: Put the work dir here
set "workdir=%1
set "workdir=%workdir:\=\\%"

setlocal enableDelayedExpansion
for /f "usebackq tokens=* delims=" %%a in (`
    wmic process  where 'CommandLine like "%%!workdir!%%" and not CommandLine like "%%RuntimeBroker%%"' get CommandLine^,ProcessId  /format:value
`) do (
    for /f "tokens=* delims=" %%# in ("%%a")  do (
        if "%%#" neq "" (                   
            set "%%#"                   
            SET var="%%#"
            SET searchVal=ProcessId
            SET var|FINDSTR /b "var="|FINDSTR /i %searchVal% >nul           
            IF ERRORLEVEL 1 (echo.) ELSE (taskkill /pid !ProcessId! /f)         
        )        
    )

)

goto end

:help
echo ********************
echo * Example of Usage *
echo ********************
echo.
echo =============================================
echo closeapp \\server\path\test
echo.  

:end

我完全无法让这个脚本工作。它返回一个无效的查询错误。 - Milan

1
我认为PowerShell是完成此任务的更简单方法。
您可以从cmdlet get-process 开始。
get-process | select ProcessName, Path 

这将显示进程所在的名称和路径。
然后,您需要确保没有任何进程从您关心的路径运行。如果它们正在运行,则应使用stop-process -id $id -force

0

这个对我很有效...

请参考下面的示例

FOR /F "delims=" %%G in ('FORFILES /P "%ProgramFiles%\Microsoft VS Code" /M *.EXE /S') DO ( TASKKILL /F /IM %%G /T )

本质上,它将杀死 %ProgramFiles%\Microsoft VS Code 目录及其子目录中的所有进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接