raffi3110
Goto Top

Prozess per PID killen - Bestimmte Zeichenfolge aus Txt-Datei in Batch-Datei nutzen

Hallo zusammen,
ich habe folgendes Problem. Ich schreibe gerade an einer Batchdatei und bin an einen Punkt gelangt wo ich nicht mehr durch Recherche weiterkomme.

Warum ich diese Batchdatei brauche ist dieser Grund:
Der User soll wenn ihm der Prozess UNWICHTIG.EXE hängen bleibt diesen Prozess durch ausführen der Batchdatei schließen können. Problem bei diese Sache ist jetzt aber man kann nicht einfach hergehen und den Befehl:

@echo off
echo.
echo Unwichtig wird beendet
echo.
taskkill /im UNWICHTIG.EXE

in die Batchdatei schreiben. Da diese Batchdatei im Netzwerk ausgeführt wird und dort mehrere UNWICHTIG.EXE Prozesse von verschiedenen Usern laufen.
Darum bin ich hergegangen und habe mir versucht die PID des Prozesses zu suchen und diesen dann mittels der PID zu beenden.

Zuerst habe ich mir die txt-Dati "var" erstellt. Danach habe ich mir die tasklist als CSV generiert und danach mir komplett alle Angaben zum Prozess UNWICHTIG.EXE geholt und in die txt-Datei geschrieben.

@echo off
echo.
echo unwichtig killen
echo.

var.txt
tasklist /FO "CSV" /FI "IMAGENAME eq UNWICHTIG.EXE" > var.txt


Problem ist das ich nicht weiß wie ich wie ich jetzt die PID aus der txt-Datei bekomme und wieder in die Batchdatei um den Prozess per PID zu schließen.

Gibt es vielleicht auch eine andere Möglichkeit? Vielleicht denke ich zu kompliziert.
Es muss aber vollautomatisch sein da die User nicht wissen sollen wie die Batchdatei das macht.

Ich hoffe ich habe das Problem hinreichend erklärt.

Ich danke für jede Antwort.
MfG Raffi

P.S. Ich hatte echt Probleme eine angemessene Überschrift zu finden für diese Problem ich hoffe das geht face-smile

Content-Key: 101328

Url: https://administrator.de/contentid/101328

Printed on: April 25, 2024 at 08:04 o'clock

Member: Ren
Ren Nov 11, 2008 at 14:01:28 (UTC)
Goto Top
ich habe es zwar noch nicht ganz verstanden, weiß vor allem nicht, ob in der var.txt jetzt mehrere Prozesse mit dem Namen auftauchen, oder exakt einer, aber grundlegend wäre die Idee dir for-Schleife:
FOR /F "tokens=2 delims=," %i IN ('type "var.txt"') DO set pid=%i  
set pid=%pid:~1,-1%
taskkill /PID %pid%
Das ganze geht natürlich nur, wenn es nur einen Prozess mit dem Namen gibt, das Beispiel würde sonst die letzte PID nehmen. Aber in diesem Bezug habe ich dein Problem noch nicht so 100%tig verstanden.
Hoffe, ich konnte weiterhelfen
Member: raffi3110
raffi3110 Nov 11, 2008 at 15:22:43 (UTC)
Goto Top
Wir betreiben ein WTS System wo jeder User seine Session hat. Öffters stürzt ein bestimmter Prozess ab und wir müssen diesen immer wieder killen. Das ist auf dauer nervig und lenkt uns von wichtigeren dingen ab. Deswegen dachten wir uns eine Batschdatei zu schreiben mit der die User selber den Prozess schließen können.

Durch Gruppenrichtlinien können/dürfen die User den Taskmanager nicht öffnen. Daher müssen wir das immer machen.

Es gibt mehrere Prozesse die gleichnamig sind aber sich durch den Nutzer und die PID unterscheiden.

Ich habe das versucht was für mich logisch war, aber kann sein das das Falsch war, weil ich mich in diesem Thema nicht auskenne.
Danke für die schnelle antwort.
MfG Raffi

P.S. ich hoffe ich konnte den Nebel des Problems ein bisschen lichten. face-smile
Member: Biber
Biber Nov 11, 2008 at 16:32:48 (UTC)
Goto Top
Moin raffi3110,

Du kannst doch den Filter um eine weitere Bedingung erweitern.
Vorarbeit am CMD-Prompt (proof-of-concept):
tasklist /FO "CSV" /FI "IMAGENAME eq UNWICHTIG.EXE" /FI "username eq %username%"  
-oder-
tasklist /Fo list  /FI "IMAGENAME eq UNWICHTIG.EXE" /FI "username eq %username%"|find /i "PID:"  
... und danach die eigentliche Aufgabe IMHO einfacher so handeln:
taskkill  /FI "IMAGENAME eq INWICHTIG.EXE" /FI "username eq %username%"|find /i "PID:"  
[TaskKill ggf. mit Parameter /F, siehe TaskKill /?]

Grüße
Biber
Member: raffi3110
raffi3110 Nov 13, 2008 at 08:52:39 (UTC)
Goto Top
Hallo
danke für eure Beiträge haben mir sehr viel weitergehlofen. Mein Kollege und ich haben dann noch ein bisschen weiterdaran gearbeitet und sind dann zu dieser Lösung gekommen.
@echo off

TITLE Prozess beenden
COLOR F1


:ANFANG
CLS

echo.
echo  Sie koennen ausgewaehlte Programme gewaltsam beenden.
echo  Waehlen Sie hierzu eine der folgenden Kennziffern:
echo.
echo  Aktion:                   Kennziffer:
echo  =====================================
echo.
echo  Prozess1 beenden              W
echo  Prozess2 beenden              E
echo.
echo  Aktionen abbrechen            X
echo  _____________________________________
echo.
echo.
echo  Bestaetigen Sie Ihre Eingabe mit ENTER.
echo.
echo.


SET /P EINGABE=Eingabe:



IF %EINGABE%==w GOTO eingabe%EINGABE%
IF %EINGABE%==W GOTO eingabe%EINGABE%
IF %EINGABE%==e GOTO eingabe%EINGABE%
IF %EINGABE%==E GOTO eingabe%EINGABE%
IF %EINGABE%==x GOTO eingabe%ENDE2%
IF %EINGABE%==X GOTO eingabe%ENDE2%

GOTO ERRORMARKE


REM ------------------ Prozess1 beenden ----------------------------------------------

:eingabeW 

echo.
echo Prozess Prozess1 beenden
echo.

SET KillProz=PROZESS1.EXE
SET KillTemp=$var.txt
SET pid=

TASKLIST /FO "CSV" /FI "IMAGENAME EQ %KillProz%" /FI "SESSIONNAME EQ %SESSIONNAME%" > %KillTemp%  
FOR /F "tokens=2 delims=," %%i IN ('type "%KillTemp%"') DO SET pid=%%i  
IF %pid%x==x GOTO ENDE
SET pid=%pid:~1,-1%
TASKKILL /T /F /PID %pid% >NUL


SET pid=

TASKLIST /FO "CSV" /FI "IMAGENAME EQ %KillProz%" /FI "SESSIONNAME EQ %SESSIONNAME%" > %KillTemp%  
FOR /F "tokens=2 delims=," %%i IN ('type "%KillTemp%"') DO SET pid=%%i  
IF %pid%x==x GOTO ENDE
SET pid=%pid:~1,-1%
TASKKILL /T /F /PID %pid% >NUL


SET pid=

TASKLIST /FO "CSV" /FI "IMAGENAME EQ %KillProz%" /FI "SESSIONNAME EQ %SESSIONNAME%" > %KillTemp%  
FOR /F "tokens=2 delims=," %%i IN ('type "%KillTemp%"') DO SET pid=%%i  
IF %pid%x==x GOTO ENDE
SET pid=%pid:~1,-1%
TASKKILL /T /F /PID %pid% >NUL

GOTO ENDE


REM ------------------ Prozess2 beenden ----------------------------------------------

:eingabeE 

echo.
echo Prozess Prozess2 beenden
echo.

SET KillProz=PROZESS2.EXE
SET KillTemp=$var.txt
SET pid=

TASKLIST /FO "CSV" /FI "IMAGENAME EQ %KillProz%" /FI "SESSIONNAME EQ %SESSIONNAME%" > %KillTemp%  
FOR /F "tokens=2 delims=," %%i IN ('type "%KillTemp%"') DO SET pid=%%i  
IF %pid%x==x GOTO ENDE
SET pid=%pid:~1,-1%
TASKKILL /T /F /PID %pid% >NUL


SET pid=

TASKLIST /FO "CSV" /FI "IMAGENAME EQ %KillProz%" /FI "SESSIONNAME EQ %SESSIONNAME%" > %KillTemp%  
FOR /F "tokens=2 delims=," %%i IN ('type "%KillTemp%"') DO SET pid=%%i  
IF %pid%x==x GOTO ENDE
SET pid=%pid:~1,-1%
TASKKILL /T /F /PID %pid% >NUL


SET pid=

TASKLIST /FO "CSV" /FI "IMAGENAME EQ %KillProz%" /FI "SESSIONNAME EQ %SESSIONNAME%" > %KillTemp%  
FOR /F "tokens=2 delims=," %%i IN ('type "%KillTemp%"') DO SET pid=%%i  
IF %pid%x==x GOTO ENDE
SET pid=%pid:~1,-1%
TASKKILL /T /F /PID %pid% >NUL

GOTO ENDE


REM ------------------ ERROR Meldung ----------------------------------------------

:ERRORMARKE

echo.
echo  ------------------------------------------------------- 
echo    Es wurde die ungueltige Taste "%EINGABE%" gedrueckt.  
echo  ------------------------------------------------------- 
echo.
echo.

PAUSE

GOTO ANFANG

REM ------------------ ENDE ----------------------------------------------

:ENDE

DEL %KillTemp%

:ENDE2

Zur Erklärung wir haben mehrmals den Code für Prozess schließen in die Batchdatei getan, weil die User manchmal mehrere Prozesse mit gleichen Namen haben und damit diese dann auch beendet werden.

Nochmals vielen dank für eure Hilfe

MfG Raffi