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

How to Kill Running Process from a specific folder via Batch File

我正在编写一个卸载程序批处理文件,由于 运行 进程,它有时无法删除文件夹。有没有办法杀死驻留在特定文件夹中的所有 运行 进程。请记住,主文件夹中的子文件夹可能有多个进程 运行。所以我认为它需要搜索 运行 进程并强力且静默地杀死所有驻留在 "C:\Program Files\PTC" 或其中的子文件夹中的所有进程。

我确实知道如何使用 "Taskkill" 命令终止特定进程,但是在一个文件夹中搜索所有进程 运行 并将它们全部终止是我的一个难题。

提前感谢您的帮助。

比尔

使用批处理文件获取有关进程的最全面信息的方法是 WMIC 命令。尽管它不包含工作目录,所以您可能必须通过命令行来确定自己的方向。 检查脚本中的注释 bellow.First 将 workdir 变量替换为您想要的路径,如果过程看起来没问题,取消注释最后一个 line.You 可以精确:

@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 查询中的通配符,因此您可以更精确地选择。请注意,第二部分是 not 之类的(仅作为示例)。这里有更多关于 WQL

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

这是 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 /?

我认为 PowerShell 是完成此任务的更简单的方法。

您将从 cmdlet get-process

开始
get-process | select ProcessName, Path 

这将显示进程 运行 来自的名称和路径。

然后您将确保 none 个进程来自您关心的路径 运行。如果他们是 运行 你会使用 stop-process -id $id -force

您将在下面找到 npocmaka 在上面 post 中创建的脚本的改进版本。您也可以从 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

这对我有用...

参见下面的示例

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

基本上这会杀死 %ProgramFiles%\Microsoft VS Code

的根目录和子文件夹中的所有进程