2009-11-27 42 views

Respuesta

2

Ummm, TaskList & TaskKill?!

+3

, por lo que tengo 7 procesos Iexplore en marcha e inicio otro. ¿Cómo capturo ese PID cuando lo lanzo? – Nick

+3

¿No puede hacer una TaskList antes de iniciarla y después, modificarla y obtener su PID?- Sé que esta no es la manera más fácil, pero no sé de una buena manera de hacerlo con solo algunos scripts regulares de Windows. – mrduclaw

+0

@Nick, ¿quién dijo algo acerca de un paso manual? – mrduclaw

0

Creo que no se puede hacer con simples utilidades de línea de comandos, ya que IE realmente genera procesos secundarios para cada pestaña, es decir, si IE aún no se ejecuta, obtendría un proceso IE primario y un proceso hijo para la pestaña. y si IE ya se está ejecutando, simplemente obtendría un proceso hijo único.

Incluso será complicado cuando se escribe su propia herramienta para matar IE porque cuando se mata un proceso secundario (pestaña), IE recuperará automáticamente esta pestaña.

Consulte también esta pregunta relacionada: How to obtain process of newly created IE8 window? (aunque no hay una buena respuesta allí).

+0

todavía estamos atrapados con IE6 aquí! Entonces todos están en procesos separados, pero pensé que las versiones con pestañas seguían usando procesos detrás de escena. – Nick

3

puede utilizar VBScript, he aquí un ejemplo la creación de bloc de notas, a continuación, que termina usando su 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 

guardar como myscript.vbs y en la línea de comandos

c:\test> cscript /nologo myscript.vbs 
9

Esto es lo que yo uso:

@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 

El directorio está establecido en el directorio en el que se encuentra el archivo cmd. Cambiar dir para alterar eso. Modifique cmd para cambiar qué comando se ejecuta.

Si quieres un stop.cmd que mata, que se vería así

@echo off 
for /F %%i in (%~dsp0MyProg.pid) do taskkill /F /PID %%i 
del %~dsp0MyProg.pid 
+0

no funciona en win7 – JavaDev1987

+0

Acabo de probar la llamada wmic en Windows 7 y funciona. Es posible que el análisis del resultado vaya mal de alguna manera, lo comprobaré más tarde. – kybernetikos

+0

@kybernetikos Gracias! Trabajado fuera de la caja. ¡Esto me ahorró mucho esfuerzo! –

1

Por alguna razón el enfoque de conseguir identificador de proceso no funcionó para mí, pero ya que soy experto en lotes , he codificado mi propio enfoque, ajunto:

@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 
2

una ligera variación en la respuesta proporcionada por @kybernetikos ya que tiene un tema de análisis. Observe la línea 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 
1

mayoría de las veces saben lo que la tarea de empezar - en este caso, la página que se mostrará IExplorer.

Entonces, ¿qué

taskkill /FI "Windowtitle eq *yourpagetitle*" 

matará a todas las instancias de algún documento que muestre su título de la página, pero con un título específico con mayor frecuencia no debe ser exactamente una.

Tom

Cuestiones relacionadas