Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

PIDs von VBScript gestarteten Prozessen herausfinden

Frage Entwicklung VB for Applications

Mitglied: maksyuli

maksyuli (Level 1) - Jetzt verbinden

05.08.2008, aktualisiert 18.08.2008, 10502 Aufrufe, 7 Kommentare

Hallo Script Master,

ich habe folgende interessante Fragestellung über die ich schon zwei Tage lang meinen Kopf zerbreche und dies fängt langsam an zu schmerzen;)
Ich habe ein Batch file der mir ein VBScript startet. Der Batch beschäftigt sich mit seiner Sachen weiter und das VBscript zeigt inzwischen einen Statusbar in form Einer HTML Saite an, so dass der User weiß, dass da was abläuft (der Batch). Tja, nachdem der Batch fertig ist sollte dieses HTML Fenster abgeschossen werden. Bevor es aber Tod umfällt sollte man bedenken dass nicht nur es sondern auch einen weiteren wscript.exe Prozess vom VBScript gestartat wird. Ich weiß eigentlich nicht wieso diesen weiteren Prozess gestartet wurde aber man braucht ihn anscheinend um das HTML Fenster zu aktivieren. Dies geschieht mit diesen Zeilen vermute ich:

Set objWshShell = WScript.CreateObject("WScript.Shell")
objWshShell.AppActivate("Microsoft Internet Explorer")

das volle Script kann unter
http://cwashington.netreach.net/depo/view.asp?Index=796
gesehen werden nur dass ich die schleife unendlich gemacht habe anstatt bis 1000 zu zählen.

Mein Prozessor ist verrückt nach diesen Prozess (wscript.exe) und läuft die ganze Zeit wie verliebter Hund mit 45-50 Belastung wenn er gestartet ist.
Tja, das heißt natürlich dass ich auch den abschießen müsste, so dass sich der Prozessor bisschen beruhigt und sich auch mit anderen Sachen beschäftigt. Ich suche schon die ganze Zeit nach einer Möglichkeit die PID von genau diesen Prozessen herauszufinden so dass nicht einfach wahllos in die Menge von IE-s und wscript.exe-s schieße. Anscheinend hat der VBScript an sich kein PID weil er einfach eine ausführbare Datei ist aber er startet die oben beschriebenen zwei Prozesse. Diese zwei PIDs sollte ich herausfinden und die Stoppen wie mache ich das? Any suggestions?
Mitglied: bastla
05.08.2008 um 15:08 Uhr
Hallo maksyuli und willkommen im Forum!

Um mehrere "wscript"-Prozesse zu unterscheiden, könntest Du per WMI die "CommandLine"-Eigenschaft abfragen (im Beispiel gleich durch "WHERE" eingeschränkt auf Ergebnisse mit enthaltenem "wscript.exe"):
01.
strComputer = "."  
02.
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")  
03.
Set colItems = objWMIService.ExecQuery( _ 
04.
    "SELECT * FROM Win32_Process WHERE CommandLine LIKE '%wscript.exe%'")  
05.
For Each objItem in colItems  
06.
    WScript.Echo "CommandLine: " & objItem.CommandLine 
07.
Next
Grüße
bastla
Bitte warten ..
Mitglied: maksyuli
05.08.2008 um 17:54 Uhr
Bastlaaaaaaa ist der Beste,

unglaublich es hat funktioniert. Doch es hat sich herausgestellt, dass ich das eigentlich gar nicht bräuchte, denn wenn ich die blöde Schleife nicht nur unendlich mache sondern ganz raushaue taucht dieses wscript.exe Prozess gar nicht auf, sondern es kommt nur das IE Fenster hoch. Das ist eigentlich alles was ich bräuchte, nur etwas was sich hin und her schleust damit dem User nicht langweilig ist während der Batch arbeitet. Dann wird auch seine Maschine nicht belastet. Trotzdem für die die sich interessieren hier den vollen Code:

01.
‘ Killbill_vol1.vbs 
02.
strComputer = "." 
03.
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
04.
Set colItems = objWMIService.ExecQuery( _ 
05.
"SELECT * FROM Win32_Process WHERE CommandLine LIKE '%wscript.exe%'") 
06.
For Each objItem in colItems   
07.
stringText = objItem.CommandLine 
08.
'statusbar.vbs is used like an identifier for the exact prozess to terminate 
09.
n = InStr(stringText, "Statusbar.vbs") 
10.
if (n > 0) Then 
11.
objItem.Terminate 
12.
end if 
13.
Next
Und jetzt bleibet eigentlich die schwierigere Aufgabe genau ein IE von mehrere IE-s abzuknallen.

Das Resultat von den obigen code wenn mehrere IE Fenster geöffnet sind

01.
"SELECT * FROM Win32_Process WHERE CommandLine LIKE '%IEXPLORE.exe%'"
lautet

01.
CommandLine: "C:\Program Files\Internet Explorer\IEXPLORE.EXE"  
02.
CommandLine: "C:\Program Files\Internet Explorer\IEXPLORE.EXE"  
03.
CommandLine: "C:\Program Files\Internet Explorer\IEXPLORE.EXE"
Nutzt leider nichts.

Das einzige was ich bis jetzt gefunden habe und bei mir Funktioniert lautet folgender mase:

01.
for /f "delims=, tokens=2" %%i in ('tasklist /FO csv /FI "\blala\Statusbar.vbs"') do Set PID=%%~i 
02.
taskkill /PID %PID% /T /F
das Problem hier ist, dass es zwar funktioniert aber nicht sauber genug ist. Es sollte nicht einfach das letzte was geöffnet wurde wieder geschlossen werden. Falls was schief geht könnte das falsche Fenster erwischt werden. Dieser Code ist mir nicht eindeutig genug. Was könnte man da machen?
I really appreciate your help guys!
Bitte warten ..
Mitglied: bastla
05.08.2008 um 22:44 Uhr
Hallo makayuli!

Für etwas mehr Sicherheit könntest Du zwar mit dem Property "CreationDate" (der selben WMI-Abfrage wie oben, also mit "objItem.CreationDate") sorgen, indem Du die Zeit beim Erstellen des IE-Objektes mit allen Zeitwerten der "IEXPLORE.EXE"-Prozesse vergleichst, aber auch das wäre nur ein Workaround.

Zum Thema "WMI / Win32_Process" kannst Du dich ja selbst hier umsehen, vielleicht findest Du noch eine andere Möglichkeit ...
Eigentlich müsste sich aber das aufrufende Script selbst um das Beenden des IE-Prozesses kümmern (im von Dir verlinkten Originalscript durch "objIE.Quit" in der Function "CloseIE()") - daraus würde folgen, dass das Script auf das Ende des Batches warten müsste - entweder durch ein "True" als drittes Argument ("bWaitOnReturn") der "Run"-Methode, oder, indem etwa der Batch beim Beenden eine Datei erzeugt (oder löscht), deren Vorhandensein das Script abfragen kann - an passender Stelle im weiteren Ablauf oder etwa in einer Warteschleife mit zB 20 Sekunden-Abständen (mit "WScript.Sleep" erzeugt), um die Belastung etwas zu senken.
[Edit] Noch ein Nachtrag: Falls Du voraussetzen kannst, dass "Word" (ja, "Microsoft Office Word" ) verfügbar ist: http://www.microsoft.com/technet/scriptcenter/resources/qanda/nov05/hey ... [/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: maksyuli
06.08.2008 um 15:50 Uhr
WMI / Win32_Process Ja, da habe isch schon gesucht und nichts Passendes gefunden.

Sonnst Creation Date ist auch so eine Sache die nicht so putzig ist.

Weiter geht es mit MS Word aber da das Programm auf einen Server laufen wird ist es auch nichts. Aber doch sehr interessante Möglichkeit muss ich sagen.

Das mit dem Dritten Argument habe ich nicht so verstanden. Wenn ich den Statusbar per Batch aufrufe, da muss ich ja schon die Parameter übergeben aber wie übergebe ich einen Weiteren Parameter zu einem späteren Zeitpunkt wenn der Batch zu ende gekommen ist. Hmmm?

Aber die Idee mit der Datei war natürlich klasse also habe ich es genau so gemacht wie du mir vorgeschrieben hast. Der Prozessor kriegt den Prozess alle 5 sec. zu sehen also kann er ganze 4 Sekunden was anderes machen. Und die dummy datei wird nach gebrauch wieder gelöscht.

Vielen vielen Dank Bastla!
Bitte warten ..
Mitglied: bastla
06.08.2008 um 16:20 Uhr
Hallo maksyuli!

Das mit dem Dritten Argument habe ich nicht so verstanden. Wenn ich den Statusbar per Batch aufrufe, da muss ich ja schon die Parameter übergeben aber wie übergebe ich einen Weiteren Parameter zu einem späteren Zeitpunkt wenn der Batch zu ende gekommen ist. Hmmm?
Gemeint war, dass das Script auf das Ende des Batches warten müsste (was beim Aufruf über Run eben mit dem 3. Argument angegeben wird) und danach das "objIE.Close" ausführen könnte - aber da ich die Zusammenhänge zwischen Deinen jeweiligen Aufrufen nicht kenne, war das eine eher allgemeine Überlegung ...

Ansonsten freut's mich natürlich, dass Du eine akzeptable Lösung gefunden hast.

Grüße
bastla
Bitte warten ..
Mitglied: maksyuli
18.08.2008 um 17:09 Uhr
Aaaha, jetzt habe isch verstanden wie du das meinsch.
But in my concept it actually works the other way around. Nicht das VBScript ruft den Batch sondern, ich starte das VBScript vom Batch. Deswegen würde hier die Möglichkeit mit dem Run die Sachen verkomplizieren.
Also die Leser würden natürlich gerne Code sehen deswegen hier die Solution:

1) Ich starte ein VBScript der mir einen Status bar darstellt und auf ready.txt jede sekunde prüft
2) Batch läuft weiter und tut was er tun muss
3) Batch kommt zu ende und kreiert ready.txt

01.
@REM Ready file is required to signalize that the batch is completed and the statusbar can be closed 
02.
ready >> %READYFILE% 2>NUL
3) VBScript freut sich drauf weil es aus der „unendlichen“ warte Schleife rausgehen kann, sich schließen kann, und dabei den ready.txt mit auf die Fahrt ins Nirwana nehmen darf.

01.
batchStillRunning=true 
02.
Do 
03.
If objFSObject.FileExists(readyFilePath) Then 
04.
	 batchStillRunning = False 
05.
result = DeleteFile(readyFilePath) 
06.
Else  
07.
  WScript.Sleep(1000) 
08.
End If 
09.
Loop While batchStillRunning = True 
10.
 
11.
 
12.
Private Function DeleteFile(filePath) 
13.
Dim objFSO 
14.
 
15.
set objFSO = CreateObject("Scripting.FileSystemObject") 
16.
If objFSO.FileExists(filePath) Then 
17.
	On Error Resume Next  
18.
	objFSO.DeleteFile(filePath) 
19.
	If Err.Number <> 0 Then  
20.
	  Set objFSO = Nothing 
21.
	  DeleteFile = Err.Number : Exit Function 
22.
	End If   
23.
    On Error Goto 0 
24.
End If    
25.
Set objFSO = Nothing 
26.
DeleteFile=0 'return 0 if no problems accrued 
27.
End Function
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Entwicklung
gelöst Get ip from external txt file and use in vbscript (5)

Frage von thankusomuch zum Thema Entwicklung ...

Server-Hardware
gelöst Netzteil Watt Power herausfinden (6)

Frage von M.Marz zum Thema Server-Hardware ...

Netzwerke
Clientname anhand MAC Adresse herausfinden (13)

Frage von VerruecktesPferd zum Thema Netzwerke ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...