如何通过批处理文件

时间:2016-03-21 22:25:48

标签: batch-file process sccm

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

我确实知道如何使用“Taskkill”命令杀死一个特定的进程,但是搜索文件夹中运行的所有进程并将其全部删除都是有点过头了。

感谢您的帮助。

比尔

5 个答案:

答案 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

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