10

有没有办法纯粹在 .bat 文件中做到这一点?

目的是启动iexplore.exe,然后在它完成时杀死那个实例。

4

8 回答 8

11

这是我使用的:

@echo off

rem there is a tab in the file at the end of the line below
set tab=    
set cmd=javaw -jar lib\MyProg.jar
set dir=%~dp0

echo Starting MyProg
set pid=notfound

for /F "usebackq tokens=1,2 delims=;=%tab% " %%i in (
    `wmic process call create "%cmd%"^, "%dir%"`
) do (
    if /I %%i EQU ProcessId (
        set pid=%%j
    )
)

echo %pid% > MyProg.pid

该目录设置为 cmd 文件所在的目录。更改dir以更改它。修改cmd以更改运行的命令。

如果你想要一个杀死它的 stop.cmd,它看起来像这样

@echo off
for /F %%i in (%~dsp0MyProg.pid) do taskkill /F /PID %%i
del %~dsp0MyProg.pid
于 2012-07-23T16:12:33.747 回答
3

您可以使用 vbscript,这是一个创建记事本的示例,然后使用其 pid 终止它

strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
errReturn = objProcess.Create("notepad.exe", null, objConfig, PID)
If errReturn = 0 Then
    WScript.Echo "Process ID is: " & PID
End If 

WScript.Echo "Ready to kill process: " & PID & "? [Y|y]"
Do While Not WScript.StdIn.AtEndOfLine
   strInput = strInput & WScript.StdIn.Read(1)
Loop
If LCase(strInput) = "y" Then
    WScript.Echo "Select * from Win32_Process Where ProcessId = '" & PID & "'"
    Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where ProcessId = '" & PID & "'")
    For Each objProcess in colProcessList
        objProcess.Terminate()
    Next
End If 

另存为 myscript.vbs 并在命令行上

c:\test> cscript /nologo myscript.vbs
于 2009-11-27T12:35:29.640 回答
2

大多数情况下,您确实知道要开始什么任务——在这种情况下,iexplorer 将显示哪个页面。

那么怎么样

taskkill /FI "Windowtitle eq *yourpagetitle*"

它会杀死显示页面标题的所有实例,但是对于特定标题,通常应该只有一个。

汤姆

于 2017-10-17T13:39:11.213 回答
2

@kybernetikos 提供的答案略有不同,因为它存在解析问题。注意线if %%j gr 0 (

@echo off

rem there is a tab in the file at the end of the line below
set tab=    
set cmd=javaw -jar lib\MyProg.jar
set dir=%~dp0

echo Starting MyProg
set pid=notfound

for /F "usebackq tokens=1,2 delims=;=%tab% " %%i in (
    `wmic process call create "%cmd%"^, "%dir%"`
) do (
    if %%j gtr 0 (
        set pid=%%j
    )
)

echo %pid% > MyProg.pid
于 2015-08-02T06:17:11.457 回答
1

嗯,任务列表和任务杀?!

于 2009-11-27T10:03:16.397 回答
1

出于某种原因,您获取进程 id 的方法对我不起作用,但由于我是批处理方面的专家,所以我编写了自己的方法,附在此处:

@echo off

call:AsyncCmd
rem call:AsyncCmd "echo hello world"
rem call:AsyncCmd "call build.bat"
exit /b

rem ------------------------------------------------------------------------------------------
rem Starts asynchronous command execution 
rem %1 is command, if empty - only aborts existing build.
rem ------------------------------------------------------------------------------------------
:AsyncCmd
if exist %~dp0SetupBuild_Completed.txt (
    del /f %~dp0SetupBuild_Pid.txt >nul 2>&1
    del /f %~dp0SetupBuild_Completed.txt >nul 2>&1
)

if not exist %~dp0SetupBuild_Pid.txt goto lStartProc
    rem --------------------------------------------------
    rem Abort build process
    rem --------------------------------------------------
    set /p pid=<%~dp0SetupBuild_Pid.txt
    echo Cancelling setup build process, process id %pid%
    pskill -t %pid%
    del /f %~dp0SetupBuild_Pid.txt >nul 2>&1

:lStartProc
if "%~1" == "" exit /b 0

rem --------------------------------------------------
rem Starts asyncronous build process
rem --------------------------------------------------
set dir=%~dp0
set dir=%dir:~0,-1%
for /f "tokens=2 delims==; " %%a in ('wmic process call create "cmd /c mincon.exe && %~1 && echo 1>%~dp0SetupBuild_Completed.txt"^, "%dir%" ^| findstr /r "ProcessId"') do set pid=%%a
echo Setup build started, process id: %pid%
echo %pid%>%~dp0SetupBuild_Pid.txt
exit /b 0
于 2013-05-01T06:07:16.517 回答
0

我认为你不能用简单的命令行实用程序来做到这一点,因为 IE 实际上会为每个选项卡生成子进程,即如果 IE 尚未运行,你将获得一个父 IE 进程和一个用于选项卡的子进程,如果 IE 是已经在运行你只会得到一个子进程。

当你编写自己的工具来杀死 IE 时甚至会非常棘手,因为当你杀死一个子(选项卡)进程时,IE 会自动恢复这个选项卡。

另请参阅此相关问题:如何获取新创建的 IE8 窗口的进程?(尽管那里没有好的答案)。

于 2009-11-27T10:17:31.797 回答
0

PowerShell 可用于此:

powershell -executionPolicy bypass -command "& {$process = start-process $args[0] -passthru -argumentlist $args[1..($args.length-1)]; exit $process.id}" notepad test.txt

echo Process ID of new process: %errorlevel%
于 2020-01-22T15:17:28.893 回答