2009-11-27 61 views
8

有沒有辦法在一個.bat文件完全做到這一點?如何從命令行啓動進程時捕獲進程的PID?

的目的是爲了推出iexplore.exe,那麼當它的完成擊殺只是實例。

+6

只是爲了記錄:DOS沒有PID。如果你指的是Windows命令行環境,然後這麼說,但作爲DOS它進來16色固定寬度的字體,請不要標記一切...... – Joey 2009-11-27 18:31:43

回答

2

嗯,TaskList & TaskKill?!

+3

所以我有7 Iexplore在處理了,並推出一個又一個。我如何在啓動時捕獲該PID? – Nick 2009-11-27 10:07:40

+3

在啓動之前和之後不能完成任務列表,區分它們並獲取您的PID? - 我知道這不是最簡單的方法,但我不知道只用一些常規的Windows腳本就可以完成這項工作。 – mrduclaw 2009-11-27 10:13:22

+0

@尼克,誰說手動步驟? – mrduclaw 2009-11-28 20:58:30

0

我認爲你不能做簡單的命令行實用程序,如IE實際派生子流程,每個選項卡,也就是說,如果IE瀏覽器尚未運行,你會得到一個父IE進程和子進程的選項卡,如果IE已經運行,你只需要一個子進程。

當你編寫自己的工具來殺死IE,因爲當你殺死一個孩子(TAB)工藝這將是甚至相當棘手,IE會自動恢復該選項卡。

又見此相關的問題:How to obtain process of newly created IE8 window?(雖然沒有很好的答案有)。

+0

我們仍然堅持使用IE6!所以他們都在單獨的進程 - 但我認爲後來的選項卡版本仍然使用幕後流程。 – Nick 2009-11-27 11:18:17

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 
9

這裏終止這是我用什麼:

@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 
+0

不能在win7上工作 – JavaDev1987 2015-06-24 17:25:59

+0

我剛剛在Windows 7上試過了wmic調用,它工作正常。某種程度上解析結果可能會出錯,我會稍後再檢查。 – kybernetikos 2015-06-25 22:24:39

+0

@kybernetikos謝謝!開箱即用。這節省了我很多努力! – 2016-05-11 07:28:19

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 
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 
1

大多數情況下你知道你要啓動的任務 - 在這種情況下,IEXPLORER應顯示的頁面。

因此,如何

taskkill /FI "Windowtitle eq *yourpagetitle*" 

它會殺死的顯示網頁標題的東西所有情況下,具有特定標題經常有應該只有一個。

Tom