如何通过批处理文件从特定文件夹中终止 运行 进程
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
的根目录和子文件夹中的所有进程
我正在编写一个卸载程序批处理文件,由于 运行 进程,它有时无法删除文件夹。有没有办法杀死驻留在特定文件夹中的所有 运行 进程。请记住,主文件夹中的子文件夹可能有多个进程 运行。所以我认为它需要搜索 运行 进程并强力且静默地杀死所有驻留在 "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
的根目录和子文件夹中的所有进程