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.
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.
Also habe ich 7 Iexplore-Prozesse und starte eine andere. Wie erfasse ich diese PID, wenn ich sie starte? – Nick
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
@Nick, wer hat etwas über einen manuellen Schritt gesagt? – mrduclaw
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).
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
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
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
funktioniert nicht auf win7 – JavaDev1987
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
@kybernetikos Danke! Arbeitete aus der Box. Das hat mir viel Mühe erspart! –
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
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
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
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