2009-11-27 12 views
8

Gibt es eine Möglichkeit, dies rein in einer .bat-Datei zu tun?Wie erfassen Sie die PID eines Prozesses beim Start von der Kommandozeile?

Der Zweck ist, iexplore.exe zu starten, dann nur diese Instanz zu töten, wenn es fertig ist.

+6

Nur für den Rekord: DOS hat keine PIDs. Wenn Sie die Windows-Befehlszeilenumgebung meinen, dann sagen Sie das, aber bitte markieren Sie nicht alles als DOS, das in 16-Farben-Fonts mit fester Breite kommt ... – Joey

Antwort

2

Ummm, TaskList & TaskKill?!

+3

Also habe ich 7 Iexplore-Prozesse und starte eine andere. Wie erfasse ich diese PID, wenn ich sie starte? – Nick

+3

Können Sie nicht eine TaskList tun, bevor Sie es starten und nach, diff sie und erhalten Sie Ihre PID?- Ich weiß, dass dies nicht der einfachste Weg ist, aber ich kenne keine nette Art, dies mit nur ein paar normalen Windows-Skripten zu tun. – mrduclaw

+0

@Nick, wer hat etwas über einen manuellen Schritt gesagt? – mrduclaw

0

Ich denke, dass Sie dies nicht mit einfachen Befehlszeilen-Dienstprogramme tun können, da IE tatsächlich untergeordnete Prozesse für jede Registerkarte erstellt, dh wenn IE noch nicht ausgeführt wird, erhalten Sie einen übergeordneten IE-Prozess und einen untergeordneten Prozess für die Registerkarte, und wenn IE bereits läuft, würden Sie einfach einen einzigen Kindprozess bekommen.

Es wird sogar ziemlich schwierig, wenn Sie Ihr eigenes Tool zum Töten von IE schreiben, denn wenn Sie einen Kind (Tab) -Prozess beenden, wird der IE diese Registerkarte automatisch wiederherstellen.

Siehe auch diese verwandte Frage: How to obtain process of newly created IE8 window? (obwohl es keine gute Antwort gibt).

+0

wir sind immer noch mit IE6 hier stecken! Sie befinden sich also alle in separaten Prozessen - aber ich dachte, spätere Versionen mit Registern würden immer noch Prozesse hinter den Kulissen verwenden. – Nick

3

Sie können VBScript verwenden, hier ist ein Beispiel Notizblock zu schaffen, endet es dann seine pid mit

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 

speichern als myscript.vbs und auf der Kommandozeile

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

Hier ist, was ich benutze:

@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 

Das Verzeichnis wird auf das Verzeichnis festgelegt, in dem sich die cmd-Datei befindet. Ändern Sie dir, um das zu ändern. Ändern Sie cmd, um zu ändern, welcher Befehl ausgeführt wird.

Wenn Sie eine stop.cmd wollen, dass es tötet, es ist wie dieses

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

funktioniert nicht auf win7 – JavaDev1987

+0

Ich habe gerade versucht, den wmic Anruf auf Windows 7 und es funktioniert. Es ist möglich, dass das Parsing des Ergebnisses irgendwie schief geht. Ich werde es später überprüfen. – kybernetikos

+0

@kybernetikos Danke! Arbeitete aus der Box. Das hat mir viel Mühe erspart! –

1

Aus irgendeinem Grund aussehen würde Ihr Ansatz Prozess-ID des Erhaltens nicht für mich arbeiten, aber da bin ich Experte in den Reihen ich habe meinen eigenen Ansatz codiert, das Anbringen hier:

@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

eine leichte Abwandlung der Antwort von @kybernetikos vorgesehen, da es eine Parsing Problem hat. Beachten Sie die Zeile 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

Meistens wissen Sie tun, welche Aufgabe Sie beginnen - in diesem Fall die Seite iexplorer zeigen soll.

So wie etwa

taskkill /FI "Windowtitle eq *yourpagetitle*" 

Es wird alle Instanzen von etwas, um Ihren Seitentitel töten, aber mit einem bestimmten Titel am häufigsten sollte es genau sein.

Tom

Verwandte Themen