dantegabriel
Goto Top

VBS Taskkill PID

Hallo zusammen, ich habe ein kleines Problem mit einem VBS Script.

Aktuell möchte ich ein Script zum neustarten einiger Prozesse schreiben, welches einen Prozess terminiert und anschließend wieder startet. Jedoch komme ich beim Befehl für den Taskkill nicht weiter.

back-to-topCode
 ' Definitionen
 Dim Dateisystem, Textdatei1, Path_Textdatei1, PID1, taks_kill
 Dim oShell

 ' Hole die aktuelle PIT
 Path_Textdatei1 = "c:\PFAD_ZUR_DATEI\pid.txt"


 Set Dateisystem = CreateObject("Scripting.FileSystemObject")
 Set Textdatei1 = Dateisystem.OpenTextFile(Path_Textdatei1)

 PID1 = Textdatei1.ReadAll


 ' Schneide den Rest des Strings ab, der nicht zur Pid gehört.
 ' Mid (Datei,Anfang,Anzahl Zeichen)
 PID1 = CStr(Mid(PID1,5,Len(PID1)-5))

 'Test bekannte PID manuell setzten
 ' PID1 = "3536"

 ' Beende Prozesse
 Set oShell = CreateObject("WScript.Shell")
 oShell.Run("taskkill /f /PID "+CStr(PID1))

back-to-topProblemstellung

Das Skript beendet den Prozess nicht und es wird auch keine Fehlermeldung ausgegeben...

Wenn ich jetzt den Kommentar bei "Test..." entferne und die PID (die ich ja weiß) manuell vergebe, wird der Prozess wie gewünscht beendet.
Auffällig ist, das es so keine sichtbaren Unterschiede zwsichen der automatisch befüllten Varriable PID (mit der PID aus der TXT Datei) und der manuell angegeben Varriable PID gibt.
Beide haben den selben Typ, beide sind gleich lang, beide haben den selben Inhalt.

Warum funktioniert es bei der manuellen Eingabe, nicht jedoch bei dem automatischen Übernehmen der PID aus der TXT... ich verstehe es einfach nicht.
Vielleicht übersehe ich auch nur etwas naja... hoffe ihr könnt mir weiter helfen face-smile

back-to-topUmgebung

Das Skript soll in einer Windows Umgebung ausgeführt werden. (Dort später (je nach Prozess) auf Windows 7 und Windows Server 2k8 R2.)


Gruß
Dante Gabriel

Content-ID: 264998

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

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

114757
Lösung 114757 02.03.2015 aktualisiert um 13:27:42 Uhr
Goto Top
Du hast 100% einen unsichtbaren Zeilenumbruch in deinem String face-wink
PID1 = Textdatei1.ReadLine
PID1 = Trim(Mid(PID1,5))
Ich würde das killen stattdessen mit WMI machen
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where ProcessID = '3536'")  
For Each objProcess in colProcessList
    objProcess.Terminate()
Next
Gruß jodel32
DanteGabriel
DanteGabriel 02.03.2015 um 13:25:39 Uhr
Goto Top
Stimmt an WMI hab ich gar nicht gedacht Danke face-smile

Wobei ich es trotzdem komisch finde, warum das ganze über Shell.Run nicht so ganz funktioniert...

Naja so läuft es auf jeden Fall, das ist die Hauptsache.


Gruß
Dante Gabriel
114757
114757 02.03.2015 um 13:26:52 Uhr
Goto Top
Wobei ich es trotzdem komisch finde, warum das ganze über Shell.Run nicht so ganz funktioniert...
Siehe Ergänzung oben ... "Zeilenumbruch" face-wink
DanteGabriel
DanteGabriel 02.03.2015 aktualisiert um 13:47:53 Uhr
Goto Top
Das wäre naheliegend, aber dann wären die Zeichen nicht gleich lang.

Die Länge des Strings den ich selbst angebe und die Länge des Strings der aus der TXT kommt (nachdem dieser beschnitten wurde) ist exakt die gleiche.
Habe es aber zur Sicherheit noch mit Trim probiert, aber damit funktioniert es wie bereits vermutet auch nicht.

Gruß
Dante Gabriel
114757
114757 02.03.2015 um 14:07:03 Uhr
Goto Top
Path_Textdatei1 = "c:\PFAD_ZUR_DATEI\pid.txt"   
Set Dateisystem = CreateObject("Scripting.FileSystemObject")   
Set content = Dateisystem.OpenTextFile(Path_Textdatei1,1).ReadAll()
set regex = CreateObject("vbscript.regexp")  
regex.Pattern = "\d+"  
set matches = regex.Execute(Content)
if matches.Count > 0 then
    PID1 = matches(0)
    oShell.Run "taskkill /f /PID " & PID1,0,True  
End if
Damit läuft das hier problemlos auch mit einer ID aus einer Textdatei. Da du hier aber den Inhalt deiner Datei nicht gepostet hast ist das dann Glaskugelraten ...
DanteGabriel
DanteGabriel 02.03.2015 um 14:25:07 Uhr
Goto Top
Hm... kann ich persönlich nicht nachvollziehen.

Die Strktur ist schon so wie Sie eingangs vermutet hatten.

PID=2796


Entsprechend mit einer leeren zweiten Zeile und einem Leerzeichen hinter der PID Zahl. In ihrem Beispiel wird die PID ja durch den Regex Eintrag aus der TXT ausgelesen, in meinem Beispiel weiß ich das die Anzahl an Zeichen vor der PID immer 4 Zeichen sind. (D.h PID=) Deswegen hatte ich die Pid mit der länge des aus der TXT Datei ausgelesenen Inhaltes - 4 als Länge der PID angenommen.

Aber wo ich das gerade so schreibe fällt mir ein was der Fehler ist face-smile

Trim kann so wie aussieht das Leerzeichen am Ende nicht entfernen, wenn ich die Länge um 1 erhöhe d.h.

PID1 = CStr(Mid(PID1,5,Len(PID1)-6))

funktioniert es face-smile


Cool, manchmal reicht es schon mit jemandem darüber zu sprechen, vielen Dank face-smile
114757
114757 02.03.2015 aktualisiert um 14:40:06 Uhr
Goto Top
Trim kann so wie aussieht das Leerzeichen am Ende nicht entfernen
Doch natürlich kann es wenn es denn tatsächlich ein Leerzeichen und kein Tab etc. ist ... http://www.w3schools.com/vbscript/func_trim.asp
Wie gesagt ohne exakten Output deiner Textdatei .....damit wäre das ein klax und sofort gelöst
File in einem anderen Format (UTF8 / etc )?

ja durch den Regex Eintrag aus der TXT ausgelesen
wie du siehst zuverlässiger face-wink damit bin ich mir 100% sicher das nur Digits reinkommen.
Und bei deiner Methode musst du die ja die Länge vorher wissen ....
DanteGabriel
DanteGabriel 02.03.2015 um 14:45:56 Uhr
Goto Top
Zitat von @114757:

> Trim kann so wie aussieht das Leerzeichen am Ende nicht entfernen
Doch natürlich kann es wenn es denn tatsächlich ein Leerzeichen und kein Tab etc. ist ...
http://www.w3schools.com/vbscript/func_trim.asp
Wie gesagt ohne exakten Output deiner Textdatei .....damit wäre das ein klax und sofort gelöst
File in einem anderen Format (UTF8 / etc )?


Stimmt, aber so genau habe ich es nicht in Notepad++ gesehen. Wenn die PID aus 4 Zeichen besteht ist die Länge dessen was aus der Datei ausgelesen wird folgerichtig 10. (Deswegen funktioniert das mit 6 jetzt auch)

Zitat von @114757:

> ja durch den Regex Eintrag aus der TXT ausgelesen
wie du siehst zuverlässiger face-wink damit bin ich mir 100% sicher das nur Digits reinkommen.

Ja das kann ich so unterschreiben ;) Aber jetzt weiß ich zumindest wo ich einen Gedankenfehler hatte und hab gleich noch eine Alternative wie man es besser machen könnte. Naja jetzt bin ich aber in jedem Fall schlauer und weiß obendrein noch was ich genau falsch gemacht habe.

Unterm Strich, sehr ergibig und vollständig gelöst. Supi face-smile