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

CPU Belastung eines Prozzesses in Prozent berechnen.

Frage Entwicklung Batch & Shell

Mitglied: mycroftone

mycroftone (Level 1) - Jetzt verbinden

29.06.2012 um 14:09 Uhr, 4572 Aufrufe, 13 Kommentare

Mit

WMIC /OUTPUT:C:\temp\ProcessList.txt PROCESS get Caption,ProcessId, ExecutablePath,ParentProcessID,KernelModeTime,UserModeTime

Möchte ich bestimmte Prozzesse beobachten.
( Starte eine Batch Datei alle 5 min per geplanten Task).
Wieviel, welcher Art, von welchen ElternProzzzes, und die CPU Belastung in %.

Die ersten habe ich. Aber bei der Prozzessorbelastung in % tue ich micht schwer, weil die Angaben in Nanosekunden sind und nicht in Prozent. (Deswegen kann es noch sein das Batch gar nicht das richtige ist wegen den hohen Zahlen).

Langsam wird es er eine theoritsche Frage. Wie ich von dem Nanosekunde auf die Prozentualle Rechnerauslastung komme.
Alls möglichen Rechnenformelansätze die ich bis jetzt gefunden habe, und erst versucht habe per Excel auszuprobieren, wahren nicht wirklich erfolgversprechend.

Also ich habe folgende Textdatei mit den Zeiten der Prozzesse und möchte dann jetzt die prozentuale Verteilung.

01.
Caption                 ExecutablePath                                                    KernelModeTime  ParentProcessId  ProcessId  UserModeTime   
02.
System Idle Process                                                                       2780593281250   0                0          0              
03.
System                                                                                    14652812500     0                4          0              
04.
smss.exe                                                                                  60937500        4                444        0              
05.
csrss.exe               C:\WINDOWS\system32\csrss.exe                                     1637343750      444              492        282187500      
06.
winlogon.exe            C:\WINDOWS\system32\winlogon.exe                                  514218750       444              516        46093750       
07.
services.exe            C:\WINDOWS\system32\services.exe                                  815937500       516              564        81406250       
08.
lsass.exe               C:\WINDOWS\system32\lsass.exe                                     380781250       516              576        57343750       
09.
svchost.exe             C:\WINDOWS\system32\svchost.exe                                   5937500         564              752        1250000        
10.
svchost.exe             C:\WINDOWS\system32\svchost.exe                                   291250000       564              832        61406250       
11.
svchost.exe             C:\WINDOWS\system32\svchost.exe                                   21718750        564              896        6406250        
12.
svchost.exe             C:\WINDOWS\system32\svchost.exe                                   12656250        564              912        2656250        
13.
svchost.exe             C:\WINDOWS\System32\svchost.exe                                   2138906250      564              928        394062500     
14.
 
Im Moment verfolge ich folgende Theorie.

- System Idel Process + System + KernelModeTime + UserModeTime von jeden Process zusammenaddiert ergeben 100 %. => Systemzeit

- Die Zeit eines Prozesses ist KernelModeTime + UserModeTime dieses Prozzesses => Prozzeszeit

- Die Prozentuale Belastung des Systems durch den Prozesse ist dann Prozzeszeit / Systemzeit *100 => Prozentualle Belastung .


Kann mir jemand bestätigen oder wiederlegen ob meine Überlegung richtig ist .

Und dann wie ich dann die Berechnung in Batch oder eventuell in VBS vornehme.

Viele Dank im Vorraus
Mitglied: mycroftone
29.06.2012 um 17:14 Uhr
Also die Berechnung an sich Stimmt.

Habe ich jetzt mit Excel nochmal nachgeprüft.

Einfach die Werte aus der Spalte KernelModeTime und der Spalte UserModetime unten einmal Addieren.
Dann die zweit Werte zusammen Addieren.
Eine neuen Spalten in den die KernelModeTime und UserModetime zusammen Addiertwerden.
Und dann wieder eine neue Spalte in der der letzt Wert durch die Gesamtzeit gezeilt wird.
Wenn man dann alle Werte unten wieder zusammenzählt kommt 1 raus.
Also alle zusammen sind 100 Prozent.

Aber jetzt happerts an der Umsetzung .

Bei eine Batchdatei ist schon alleine das Zusammenzählen der Werte in eine For / K schleife schwierig weil zuviele Leerzeichen in Pfaden sein können.
Also Delim exe zu nutzen habe ich auch verworfen weil die ersten beiden EInträge keine exe sind.


ALso kann mir jemand die werte per Batch oder VBS zusammenzählen.
Ich weiß das es hier ein paar findige Leute gibt.
Bitte warten ..
Mitglied: rubberman
29.06.2012 um 21:03 Uhr
Hallo mycroftone,

so wie du das angehst, wirst du doch nie die Werte voneinander separieren können. Versuche doch wenigstens was Auswertbares daraus zu machen. Per Batch vielleicht erst mal so:
01.
@echo off &setlocal 
02.
>"ProcessList.csv" ( 
03.
  for /f "delims=" %%i in ( 
04.
    'WMIC PROCESS get Caption^,ProcessId^,ExecutablePath^,ParentProcessID^,KernelModeTime^,UserModeTime /format:csv' 
05.
  ) do ( 
06.
    for /f "delims=" %%j in ("%%i") do ( 
07.
      set "line=%%j" 
08.
      setlocal EnableDelayedExpansion 
09.
        echo !line:,=;! 
10.
      endlocal 
11.
12.
13.
)
So spuckt dir der Code wenigstens ein "deutsch" umformatiertes (mit Semikola als Trennzeichen) CSV Format aus. Damit könntest du dann in Excel weiter arbeiten.

Da du damit aber noch nicht on the fly zum Ergebnis kommst und das per Batch auch nicht möglich ist, frage ich mich
- Warum Batch und nicht gleich VBS oder eine andere Sprache?
- Wie soll das Ergebnis der Aktion eigentlich aussehen? Ein zusätzlicher Prozentwert in jeder Zeile? In welchem Format?

Grüße
rubberman
Bitte warten ..
Mitglied: 76109
01.07.2012 um 18:35 Uhr
Hallo mycroftone!

Hier mal ein VBS-Skript (*.vbs), dass eine CSV-Datei mit Prozentangabe (letzte Spalte) erstellt:
01.
    Const CsvPath = "E:\Test\Ausgabe.csv" 
02.
 
03.
    Const strComputer = "." 
04.
 
05.
 
06.
    Dim objWMIService, colProcesses, colProcess, Fso, File, Text, Target, TimeSumme, i 
07.
 
08.
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
09.
     
10.
    Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process") 
11.
         
12.
    ReDim Target(colProcesses.Count - 1):  i = 0    'Array(Anzahl Prozesse) 
13.
     
14.
    For Each colProcess In colProcesses 
15.
        With colProcess.Properties_      
16.
            'Array(Zeilen, Spalten) 
17.
            Target(i) = Array(.Item("Caption").Value, _ 
18.
                           .Item("ProcessId").Value, _ 
19.
                           .Item("ExecutablePath").Value, _ 
20.
                           .Item("ParentProcessID").Value, _ 
21.
                           .Item("KernelModeTime").Value, _ 
22.
                           .Item("UserModeTime").Value, _ 
23.
                            0)  'Item für Prozentangabe reservieren 
24.
             
25.
            If IsNull(Target(i)(2)) Then Target(i)(2) = ""  'Null-Rückgabe für Path eliminieren 
26.
             
27.
            'Zeiten der einzelnen Prozesse addieren 
28.
            TimeSumme = TimeSumme + CDbl(Target(i)(4)) + CDbl(Target(i)(5)) 
29.
             
30.
            i = i + 1   'Array(Zeile + 1) 
31.
        End With 
32.
    Next 
33.
     
34.
    'Text = Csv-Zeile mit Spalten-Überschrift 
35.
    Text = "Caption;ProcessId;ExecutablePath;ParentProcessID;KernelModeTime;UserModeTime;Prozent" & vbCrLf 
36.
     
37.
    For i = 0 To UBound(Target)     'Prozentwerte/Prozess berechnen und in Array eintragen 
38.
        'Prozentanteil im Format "0,000000%" in Array eintragen 
39.
        Target(i)(6) = FormatNumber((CDbl(Target(i)(4)) + CDbl(Target(i)(5))) / TimeSumme * 100, 6) & "%" 
40.
         
41.
        'Text + Csv-Zeile der einzelnen Prozesse 
42.
        Text = Text & Join(Array(Target(i)(0), _ 
43.
                                 Target(i)(1), _ 
44.
                                 Target(i)(2), _ 
45.
                                 Target(i)(3), _ 
46.
                                 Target(i)(4), _ 
47.
                                 Target(i)(5), _ 
48.
                                 Target(i)(6)), ";") & vbCrLf 
49.
    Next 
50.
     
51.
    Set Fso = CreateObject("Scripting.FileSystemObject") 
52.
     
53.
    'Csv-Datei erzeugen 
54.
    With Fso.CreateTextFile(CsvPath) 
55.
        .Write Text 
56.
        .Close 
57.
    End With


Gruß Dieter
Bitte warten ..
Mitglied: rubberman
01.07.2012, aktualisiert 02.07.2012
Hallo Zusammen.

@Dieter
Ähnlich hätte ich es vermutlich auch gelöst - vielleicht mit einem Recordset zur Sortierung der Daten, á la
01.
Dim oADORec, oWMI, colItems, oItem, oFSO, oFile 
02.
Dim arrFields, arrValues 
03.
Dim dblSum 
04.
Dim sExePath 
05.
 
06.
' Usersettings 
07.
Const sCSVPath                    = "ProcessList.csv" 
08.
Const sDelim                      = ";" 
09.
Const sComputerName               = "." 
10.
Const sReplaceNull                = "" 
11.
Const iDecimales                  =   5 
12.
 
13.
' Datentypen http://msdn.microsoft.com/en-us/library/windows/desktop/ms675318.aspx 
14.
Const adChar                      = 129 
15.
Const adUnsignedInt               =  19 
16.
Const adUnsignedBigInt            =  21 
17.
Const adDouble                    =   5 
18.
 
19.
' Datei öffnen http://msdn.microsoft.com/en-us/library/314cz14s.aspx 
20.
Const ForWriting                  =   2 
21.
 
22.
arrFields    = Array("Caption", "ProcessId", "ExecutablePath", _ 
23.
  "ParentProcessID", "KernelModeTime", "UserModeTime", "ProcessorUsage") 
24.
dblSum        = 0 
25.
 
26.
' ADO Recordset http://msdn.microsoft.com/en-us/library/windows/desktop/ms681510.aspx 
27.
Set oADORec  = CreateObject("ADODB.Recordset") 
28.
' Append http://msdn.microsoft.com/en-us/library/windows/desktop/ms681564.aspx 
29.
oADORec.Fields.Append "Caption",         adChar          , 1024 
30.
oADORec.Fields.Append "ProcessId",       adUnsignedInt 
31.
oADORec.Fields.Append "ExecutablePath",  adChar          ,  256 
32.
oADORec.Fields.Append "ParentProcessID", adUnsignedInt 
33.
oADORec.Fields.Append "KernelModeTime",  adUnsignedBigInt 
34.
oADORec.Fields.Append "UserModeTime",    adUnsignedBigInt 
35.
oADORec.Fields.Append "ProcessorUsage",  adDouble 
36.
oADORec.Open 
37.
 
38.
' Win32_Process Class http://msdn.microsoft.com/en-us/library/windows/desktop/aa394372.aspx 
39.
Set oWMI     = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _ 
40.
  & sComputerName & "\root\cimv2") 
41.
Set colItems = oWMI.ExecQuery("Select * from Win32_Process") 
42.
For Each oItem In colItems 
43.
  If IsNull(oItem.ExecutablePath) Then 
44.
    sExePath = sReplaceNull 
45.
  Else 
46.
    sExePath = oItem.ExecutablePath 
47.
  End If 
48.
  arrValues  = Array(oItem.Caption, oItem.ProcessId, sExePath, _ 
49.
    oItem.ParentProcessID, oItem.KernelModeTime, oItem.UserModeTime, 0) 
50.
  dblSum     = dblSum + arrValues(4) + arrValues(5) 
51.
  oADORec.AddNew arrFields, arrValues 
52.
Next 
53.
 
54.
Set oItem    = Nothing 
55.
Set colItems = Nothing 
56.
Set oWMI     = Nothing 
57.
 
58.
' CPU-Nutzung als Double-Wert hinzufügen 
59.
oADORec.MoveFirst 
60.
While Not oADORec.EOF 
61.
  oADORec("ProcessorUsage").Value = _ 
62.
    (CDbl(oADORec("KernelModeTime")) + CDbl(oADORec("UserModeTime"))) / dblSum 
63.
  oADORec.Update 
64.
  oADORec.MoveNext 
65.
Wend 
66.
 
67.
' Sort Property http://msdn.microsoft.com/en-us/library/windows/desktop/ms675783.aspx 
68.
'  Prozesse mit der höchsten CPU-Nutzung nach oben sortieren 
69.
oADORec.Sort = "ProcessorUsage DESC" 
70.
 
71.
' FileSystemObject http://msdn.microsoft.com/en-us/library/d6dw7aeh.aspx 
72.
'  Schreiben der Daten in die CSV Datei 
73.
Set oFSO     = CreateObject("Scripting.FileSystemObject") 
74.
Set oFile    = oFSO.OpenTextFile(sCSVPath, ForWriting, True) 
75.
oFile.WriteLine "Caption" & sDelim & "ProcessId" & sDelim & "ExecutablePath" & _ 
76.
  sDelim & "ParentProcessID" & sDelim & "ProcessorUsage" 
77.
oADORec.MoveFirst 
78.
While Not oADORec.EOF 
79.
  oFile.WriteLine _ 
80.
    oADORec("Caption")               & sDelim & _ 
81.
    CStr(oADORec("ProcessId"))       & sDelim & _ 
82.
    oADORec("ExecutablePath")        & sDelim & _ 
83.
    CStr(oADORec("ParentProcessID")) & sDelim & _ 
84.
    CStr(Round(oADORec("ProcessorUsage") * 100, iDecimales)) & "%" 
85.
  oADORec.MoveNext 
86.
Wend 
87.
oFile.Close 
88.
oADORec.Close 
89.
 
90.
Set oADORec  = Nothing 
91.
Set oFile    = Nothing 
92.
Set oFSO     = Nothing
[EDIT]Dieters Anregung folgend, Arrayelemente durch Namen ersetzt.[/EDIT]

@mycroftone
Ich weiß nicht recht, ob es das ist was du suchst. Natürlich bekommst du so keine Momentaufnahme (für eine eingeschränkte Zeitspanne), sondern eine Zusammenfassung über die gesamte Dauer der Windowssitzung. Heißt, ein Prozess der gerade erst gestartet wurde und momentan fast 100% CPU Auslastung verursacht, schlägt in deiner Auswertung vermutlich mit <1% zu Buche.

Grüße
rubberman
Bitte warten ..
Mitglied: 76109
01.07.2012 um 23:52 Uhr
Hallo rubberman!

Die Idee, einen ADO-Recordset zu verwenden, finde ich auch ganz gut

Allerdings würde ich, wenn die Felder eh schon Namen haben, diese auch im restlichen Code - zwecks besserer Übersicht - mit Namen ansprechen.

Gruß Dieter
Bitte warten ..
Mitglied: rubberman
02.07.2012 um 00:26 Uhr
Hallo Dieter,

einverstanden, ich werde es apassen. Der Grund dafür war, dass Änderungen (englische durch deutsche Feldnamen ersetzen o.ä.) nur an einer Stelle vergenommen werden müssten. Redundanzen sind dabei fehleranfälliger. Da Editoren aber heute eine "Ersetzen" Funktion mitbringen, ist das nicht weiter tragisch

Grüße
rubberman
Bitte warten ..
Mitglied: 76109
02.07.2012 um 00:48 Uhr
Hallo rubberman!

einverstanden, ich werde es apassen.
Ein Weiser Entschluß
Der Grund dafür war, dass Änderungen (englische durch deutsche Feldnamen
ersetzen o.ä.) nur an einer Stelle vergenommen werden müssten.
Das hatte ich auch so verstanden
Da Editoren aber heute eine "Ersetzen" Funktion mitbringen,
ist das nicht weiter tragisch
Das sehe ich genauso

Gruß Dieter
Bitte warten ..
Mitglied: mycroftone
03.07.2012 um 13:03 Uhr
Hallo Zusammen

Besten dank für die Programmiertechnische Umsetzung meiner Formel zur Prozessorbelastung pro Einzelprozzes.
Meine Versuch das ganze in Batch zu realisieren habe ich abgebrochen.

Aber irgendwie ist glaub ich in meiner Formel trotzdem ein Fehler drin.

Laut der habe ich immer so 97-98 Prozent die nichts tun.

Wenn ich meinen FLY Player starte dann habe ich so 6-7 Prozent Auslastung laut Taskmanager und Prozessexplorer.
Wenn ich dann die zwei Scripte starte dann sagen beiden die Prozzesorauslastung läge bei 0,0001 % .

Also zwischen den beiden Werten liegen Welten.
Kann mir jemand sagen wo da der Wurm in der Formel ist.
Bitte warten ..
Mitglied: 76109
03.07.2012 um 15:23 Uhr
Hallo mycroftone!

Die Formel stimmt schon, aber die gelieferten Werte taugen nicht für eine Berechnung der aktuellen Prozessleistung.

Die Zeit wird ja nur aufaddiert und dadurch auch nicht mehr weniger. D.h. wenn ich z.B. den Virenscanner starte, dann steigt die KernelModeTime und UserModeTime masiv an und bleibt nach Fertigstellung weiterhin in seiner Größe erhalten, was zur Folge hat, dass der Virenscanner danach zwar 0% Last zieht aber immernoch eine hohe Prozesslast berechnet wird während die anderen Prozesse so vor sich hin döddeln.

Du kannst auf diese Weise also nur ermitteln, wieviel Last ein Prozess insgesamt seit dem Windows-Start gezogen hat.

Gruß Dieter
Bitte warten ..
Mitglied: mycroftone
03.07.2012 um 15:49 Uhr
Hallo Didi1954

Muß ich dann 2 Messungen hintereinander machen und dann die Differenz nehmen.
Und dann auf die Tabellen die Berechnung vornehmen.

Komme ich dann er auf eine Derzeitige Prozzesorlast.

Mycroft
Bitte warten ..
Mitglied: rubberman
03.07.2012 um 20:41 Uhr
Hallo mycroftone.

Zitat von mycroftone:
Komme ich dann er auf eine Derzeitige Prozzesorlast.

Klingt doch nicht schlecht. Eine gewisse Zeitspanne (iWait) muss aber dazwischen liegen. Versuch macht klug ...
01.
Dim oADORec, oWMI, colItems, oItem, oFSO, oFile 
02.
Dim arrFields, arrValues 
03.
Dim sExePath 
04.
Dim dblSum 
05.
 
06.
' Usersettings 
07.
Const sCSVPath                    = "ProcessList.csv" 
08.
Const sDelim                      = ";" 
09.
Const sComputerName               = "." 
10.
Const sReplaceNull                = "" 
11.
Const iDecimales                  =   5 
12.
Const iWait                       =  10 
13.
 
14.
' Datentypen http://msdn.microsoft.com/en-us/library/windows/desktop/ms675318.aspx 
15.
Const adChar                      = 129 
16.
Const adUnsignedInt               =  19 
17.
Const adUnsignedBigInt            =  21 
18.
Const adBoolean                   =  11 
19.
Const adDouble                    =   5 
20.
 
21.
' Datei öffnen http://msdn.microsoft.com/en-us/library/314cz14s.aspx 
22.
Const ForWriting                  =   2 
23.
 
24.
arrFields    = Array("Caption", "ProcessId", "ExecutablePath", _ 
25.
  "ParentProcessID", "KernelModeTime1", "UserModeTime1", "KernelModeTime2", _ 
26.
  "UserModeTime2", "Running", "ProcessorUsage") 
27.
dblSum        = 0 
28.
 
29.
' ADO Recordset http://msdn.microsoft.com/en-us/library/windows/desktop/ms681510.aspx 
30.
Set oADORec  = CreateObject("ADODB.Recordset") 
31.
' Append http://msdn.microsoft.com/en-us/library/windows/desktop/ms681564.aspx 
32.
oADORec.Fields.Append "Caption",          adChar          , 1024 
33.
oADORec.Fields.Append "ProcessId",        adUnsignedInt 
34.
oADORec.Fields.Append "ExecutablePath",   adChar          ,  256 
35.
oADORec.Fields.Append "ParentProcessID",  adUnsignedInt 
36.
oADORec.Fields.Append "KernelModeTime1",  adUnsignedBigInt 
37.
oADORec.Fields.Append "UserModeTime1",    adUnsignedBigInt 
38.
oADORec.Fields.Append "KernelModeTime2",  adUnsignedBigInt 
39.
oADORec.Fields.Append "UserModeTime2",    adUnsignedBigInt 
40.
oADORec.Fields.Append "Running",          adBoolean 
41.
oADORec.Fields.Append "ProcessorUsage",   adDouble 
42.
oADORec.Open 
43.
 
44.
' Win32_Process Class http://msdn.microsoft.com/en-us/library/windows/desktop/aa394372.aspx 
45.
' 1. Run 
46.
Set oWMI     = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _ 
47.
  & sComputerName & "\root\cimv2") 
48.
Set colItems = oWMI.ExecQuery("Select * from Win32_Process") 
49.
For Each oItem In colItems 
50.
  If IsNull(oItem.ExecutablePath) Then 
51.
    sExePath = sReplaceNull 
52.
  Else 
53.
    sExePath = oItem.ExecutablePath 
54.
  End If 
55.
  arrValues  = Array(oItem.Caption, oItem.ProcessId, sExePath, _ 
56.
    oItem.ParentProcessID, oItem.KernelModeTime, _ 
57.
    oItem.UserModeTime, 0, 0, False, 0) 
58.
  oADORec.AddNew arrFields, arrValues 
59.
Next 
60.
 
61.
Set oItem    = Nothing 
62.
Set colItems = Nothing 
63.
 
64.
WScript.Sleep iWait * 1000 
65.
 
66.
' 2. Run 
67.
Set colItems = oWMI.ExecQuery("Select * from Win32_Process") 
68.
For Each oItem In colItems 
69.
  oADORec.MoveFirst  
70.
  oADORec.Find "ProcessID      = #" & oItem.ProcessID & "#" 
71.
  If Not oADORec.EOF Then 
72.
    oADORec("KernelModeTime2") = oItem.KernelModeTime 
73.
    oADORec("UserModeTime2")   = oItem.UserModeTime 
74.
    oADORec("Running")         = True 
75.
    oADORec.Update 
76.
  End If 
77.
Next 
78.
 
79.
Set oItem    = Nothing 
80.
Set colItems = Nothing 
81.
Set oWMI     = Nothing 
82.
 
83.
oADORec.MoveFirst 
84.
While Not oADORec.EOF 
85.
  If oADORec("Running") Then 
86.
    dblSum   = dblSum + CDbl(oADORec("KernelModeTime2")) + CDbl(oADORec("UserModeTime2")) _ 
87.
      - CDbl(oADORec("KernelModeTime1")) - CDbl(oADORec("UserModeTime1")) 
88.
  Else 
89.
    oADORec.Delete 
90.
  End If 
91.
  oADORec.Update 
92.
  oADORec.MoveNext   
93.
Wend 
94.
 
95.
' CPU-Nutzung als Double-Wert hinzufügen 
96.
oADORec.MoveFirst 
97.
While Not oADORec.EOF 
98.
  oADORec("ProcessorUsage")    = _ 
99.
    (CDbl(oADORec("KernelModeTime2")) + CDbl(oADORec("UserModeTime2")) _ 
100.
    - CDbl(oADORec("KernelModeTime1")) - CDbl(oADORec("UserModeTime1"))) / dblSum 
101.
  oADORec.Update 
102.
  oADORec.MoveNext 
103.
Wend 
104.
 
105.
' Sort Property http://msdn.microsoft.com/en-us/library/windows/desktop/ms675783.aspx 
106.
'  Prozesse mit der höchsten CPU-Nutzung nach oben sortieren 
107.
oADORec.Sort = "ProcessorUsage DESC" 
108.
 
109.
' FileSystemObject http://msdn.microsoft.com/en-us/library/d6dw7aeh.aspx 
110.
'  Schreiben der Daten in die CSV Datei 
111.
Set oFSO     = CreateObject("Scripting.FileSystemObject") 
112.
Set oFile    = oFSO.OpenTextFile(sCSVPath, ForWriting, True) 
113.
oFile.WriteLine "Caption" & sDelim & "ProcessId" & sDelim & "ExecutablePath" & _ 
114.
  sDelim & "ParentProcessID" & sDelim & "ProcessorUsage" 
115.
oADORec.MoveFirst 
116.
While Not oADORec.EOF 
117.
  oFile.WriteLine _ 
118.
    oADORec("Caption")               & sDelim & _ 
119.
    CStr(oADORec("ProcessId"))       & sDelim & _ 
120.
    oADORec("ExecutablePath")        & sDelim & _ 
121.
    CStr(oADORec("ParentProcessID")) & sDelim & _ 
122.
    CStr(Round(oADORec("ProcessorUsage") * 100, iDecimales)) & "%" 
123.
  oADORec.MoveNext 
124.
Wend 
125.
oFile.Close 
126.
oADORec.Close 
127.
 
128.
Set oADORec  = Nothing 
129.
Set oFile    = Nothing 
130.
Set oFSO     = Nothing
Prozesse, die während der Laufzeit des Scripts hinzukommen oder beendet werden, werden nicht betrachtet.

Grüße
rubberman
Bitte warten ..
Mitglied: 76109
03.07.2012, aktualisiert um 21:14 Uhr
Hallo @mycroftone, Hallo rubberman!

Das war eine sehr gute Idee und rubberman hat's ja inzwischen gerichtet

Der Vollständigkeit halber, habe ich mein Skript dann eben auch mal etwas angepasst:
01.
Option Explicit 
02.
 
03.
Const CsvPath = "E:\Ausgabe.csv" 
04.
 
05.
Const strComputer = "." 
06.
 
07.
    Dim Fso, ListeB, ListeE, Key, Token, ValueK, ValueU, ValueT, Text 
08.
    Dim objWMIService, colProcessesB, colProcessesE, colProcess 
09.
 
10.
    Set ListeB = CreateObject("Scripting.Dictionary")   'Assoziatives Array (Key, Wert) für Startwerte 
11.
    Set ListeE = CreateObject("Scripting.Dictionary")   'Assoziatives Array (Key, Wert) für Stopwerte 
12.
     
13.
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
14.
     
15.
    Set colProcessesB = objWMIService.ExecQuery("Select * from Win32_Process")    'Startwerte abfragen 
16.
     
17.
    WScript.Sleep 1000  'Pause in Millisekunden 
18.
     
19.
    Set colProcessesE = objWMIService.ExecQuery("Select * from Win32_Process")    'Stopwerte abfragen 
20.
     
21.
    For Each colProcess In colProcessesB  'Start-Prozesse in ListeB sammeln (Key=ProzessID) 
22.
        With colProcess.Properties_ 
23.
            Token = Array(.Item("Caption").Value, _ 
24.
                          .Item("ProcessId").Value, _ 
25.
                          .Item("ExecutablePath").Value, _ 
26.
                          .Item("ParentProcessID").Value, _ 
27.
                          .Item("KernelModeTime").Value, _ 
28.
                          .Item("UserModeTime").Value, _ 
29.
                           0) 
30.
             
31.
            If IsNull(Token(2)) Then Token(2) = ""  'Null-Rückgabe für Path eliminieren 
32.
 
33.
            ListeB.Add "$" & .Item("ProcessId").Value, Join(Token, ";") 
34.
        End With 
35.
    Next 
36.
     
37.
    For Each colProcess In colProcessesE  'Stop-Prozesse (nur Zeiten) in ListeE sammeln 
38.
        With colProcess.Properties_ 
39.
            Token = Array(.Item("KernelModeTime").Value, .Item("UserModeTime").Value) 
40.
            ListeE.Add "$" & .Item("ProcessId").Value, Join(Token, ";") 
41.
        End With 
42.
    Next 
43.
     
44.
    ValueT = 0  'Summe Gesamtzeiten auf 0 setzen 
45.
     
46.
    For Each Key In ListeB.Keys     'Alle Prozesse auslesen 
47.
        If ListeE.Exists(Key) Then  'Test ob Prozess bei Stop noch gelaufen ist 
48.
            Token = Split(ListeB(Key), ";") 'Prozesswerte aus ListeB laden und Differenz Start/Ende übernehmen 
49.
            ValueK = CDbl(Split(ListeE(Key), ";")(0)) - CDbl(Token(4))  'KernelModeTime 
50.
            ValueU = CDbl(Split(ListeE(Key), ";")(1)) - CDbl(Token(5))  'UserModeTime 
51.
            Token(4) = ValueK 
52.
            Token(5) = ValueU 
53.
             
54.
            ValueT = CDbl(ValueT + ValueK + ValueU) 'Summe Gesamtzeiten 
55.
             
56.
            ListeB.Item(Key) = Join(Token, ";") 'Neue Prozesswerte wieder in Liste zurückschreiben 
57.
        Else 
58.
            ListeB.Remove Key   'Wenn Prozess inzwischen terminiert, dann aus Liste entfernen 
59.
        End If 
60.
    Next 
61.
             
62.
    'Spaltenüberschrift 
63.
    Text = "Caption;ProcessId;ExecutablePath;ParentProcessID;KernelModeTime;UserModeTime;Prozent" & vbCrLf 
64.
     
65.
    For Each Key In ListeB.Keys     'Alle Prozesse auslesen 
66.
        Token = Split(ListeB(Key), ";") 'Prozesswerte aus ListeB laden 
67.
         
68.
        'Prozentwert berechnen und zu den Prozesswerten hinzufügen 
69.
        Token(6) = FormatNumber((CDbl(Token(4)) + CDbl(Token(5))) / ValueT * 100, 6) & "%" 
70.
             
71.
        Text = Text & Join(Token, ";") & vbCrLf 'Prozesswerte in einem Text-String sammeln 
72.
    Next 
73.
            
74.
    Set Fso = CreateObject("Scripting.FileSystemObject") 
75.
     
76.
    'Csv-Datei schreiben 
77.
    With Fso.CreateTextFile(CsvPath) 
78.
        .Write Text 
79.
        .Close 
80.
    End With
wobei Du die Pausen bzw. Start-/Stopzeiten nach Belieben anpassen kannst.

Gruß Dieter
Bitte warten ..
Mitglied: mycroftone
03.07.2012 um 22:22 Uhr
Ja Super! Funktioniert.

Wenn ich eine Prozess starte der laut Taskmanager und Prozessexplorer 16 % beansprucht.
Hat auch Ruppermans und Didis Prozessliste und 14 % beansprucht.

Auch wenn man Prozessexplorer und Ruppermans Liste gegenüberstellt stimmen die obersten Prozesse überein.

Besten dank.
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

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

Ähnliche Inhalte
Microsoft
Server 2012 cpu Auslastung durchgehend bei 10 prozent (1)

Frage von thomasreischer zum Thema Microsoft ...

CPU, RAM, Mainboards
CPU Lüfter von CPU entfernen (6)

Frage von uridium69 zum Thema CPU, RAM, Mainboards ...

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

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 ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...