我正在编写一个卸载程序批处理文件,由于运行过程,它偶尔会无法删除文件夹。有没有办法杀死驻留在特定文件夹中的所有正在运行的进程。请记住,主要内部的子文件夹可能会运行多个进程。所以我认为它需要搜索正在运行的进程并强制并静默地杀死驻留在“C:\ Program Files \ PTC”或其中的子文件夹中的所有内容。
我确实知道如何使用“Taskkill”命令杀死一个特定的进程,但是搜索文件夹中运行的所有进程并将其全部删除都是有点过头了。
感谢您的帮助。
比尔
答案 0 :(得分: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查询中的通配符,因此您可以更精确地选择。注意第二部分是not
喜欢(仅举例)。这里有关于WQL
答案 1 :(得分:1)
批量并不适合这一点,正如您在之前的回答中所看到的那样gobblygook。要终止的行已注释掉'
个字符。
这是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 /?
答案 2 :(得分:1)
我认为PowerShell是一种更简单的方法来完成这项任务。
您将从cmdlet get-process
get-process | select ProcessName, Path
这将显示进程运行位置的名称和路径。
然后,您将确保没有任何进程从您关注的路径运行。如果它们正在运行,您将使用stop-process -id $id -force
答案 3 :(得分: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
答案 4 :(得分: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
的根目录和子文件夹中的所有进程