Come catturare il PID di un processo quando lo si lancia dalla riga di comando?

C’è un modo per farlo solo in un file .bat?

Lo scopo è avviare iexplore.exe , quindi uccidere solo quell’istanza al termine.

Ecco cosa 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 

La directory è impostata sulla directory in cui si trova il file cmd. Cambia dir per modificarlo. Modifica cmd per cambiare il comando da eseguire.

Se vuoi un stop.cmd che lo uccida, sarebbe come questo

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

puoi usare vbscript, ecco un esempio per creare il blocco note, quindi terminarlo usando il suo 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 

salva come myscript.vbs e sulla riga di comando

 c:\test> cscript /nologo myscript.vbs 

Ummm, TaskList e TaskKill ?!

Una leggera variazione sulla risposta fornita da @kybernetikos poiché ha un problema di analisi. Notare la riga 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 

Molto spesso si sa quale attività si avvia – in questo caso, quale pagina deve mostrare Iexplorer.

Che ne dici?

 taskkill /FI "Windowtitle eq *yourpagetitle*" 

Ucciderà tutte le istanze di qualcosa che mostra il titolo della tua pagina, ma con un titolo specifico molto spesso dovrebbe essercene esattamente uno.

Tom

Per qualche motivo il tuo approccio per ottenere l’id del processo non ha funzionato per me, ma dal momento che sono esperto in batch, ho codificato il mio approccio, allegando qui:

 @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 

Penso che non sia ansible farlo con semplici utility da riga di comando, dato che IE genera in realtà processi figlio per ogni scheda, cioè se IE non è ancora in esecuzione si otterrebbe un processo IE padre e un processo figlio per la scheda e se IE è già in esecuzione si otterrebbe semplicemente un processo figlio unico.

Sarà persino abbastanza complicato scrivere un tuo strumento per uccidere IE perché quando uccidi un processo figlio (tab), IE recupererà automaticamente questa scheda.

Vedi anche questa domanda correlata: come ottenere il processo della finestra IE8 appena creata? (anche se non c’è una buona risposta lì).