¿Hay alguna manera de hacer esto puramente en un archivo .bat?Cómo capturar el PID de un proceso cuando lo ejecuta desde la línea de comando?
El propósito es ejecutar iexplore.exe
, luego matar solo esa instancia cuando haya terminado.
¿Hay alguna manera de hacer esto puramente en un archivo .bat?Cómo capturar el PID de un proceso cuando lo ejecuta desde la línea de comando?
El propósito es ejecutar iexplore.exe
, luego matar solo esa instancia cuando haya terminado.
, por lo que tengo 7 procesos Iexplore en marcha e inicio otro. ¿Cómo capturo ese PID cuando lo lanzo? – Nick
¿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
@Nick, ¿quién dijo algo acerca de un paso manual? – mrduclaw
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í).
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
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
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
no funciona en win7 – JavaDev1987
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
@kybernetikos Gracias! Trabajado fuera de la caja. ¡Esto me ahorró mucho esfuerzo! –
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
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
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
Solo para el registro: DOS no tiene PID. Si se refiere al entorno de la línea de comandos de Windows, dígalo, pero no marque todo como DOS que viene en fuentes de ancho fijo de 16 colores ... – Joey