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-Auslastung einlesen mit VBS und Datei erzeugen wenn unter 20 Prozent

Frage Entwicklung VB for Applications

Mitglied: megamazl

megamazl (Level 1) - Jetzt verbinden

22.08.2008, aktualisiert 23.08.2008, 8750 Aufrufe, 9 Kommentare

Hallo Administrator Gemeinde,

folgendes Vorhaben:
Ich habe ein Netzwerk mit 11 Rechnern. Einer ist der Zentralrechner auf dem Videos geschnitten werden. Diese Videos müssen danach noch umgewandelt werden. Dies soll auf den 10 anderen Rechnern geschehen. Allerdings müßte die Umcodierung so geregelt werden, daß der Zentralrechner die Videos mit Xcopy auf die anderen Rechner verteilt, wo sie dann mit einem Codierungsprogramm mit Watchfolder-Funktion umcodiert werden. Allerdings sollen diese Dateien natürlich nur kopiert werden, wenn der jeweilige Umcodierungsrechner nicht grade am arbeiten ist. Um das herauszufinden habe ich folgendes Script geschrieben, welches eine Datei erzeugen soll, wenn die Prozessorlast unter 20% ist. Wenn die Last über 20% ist, soll diese Datei wieder gelöscht werden. Somit kann mit einer einfachen "if exist" Abfrage des Zentralrechners überprüft werden, ob der Codierrechner besetzt ist.

01.
On Error Resume Next  
02.
 
03.
strComputer = "."  
04.
Set objWMIService = GetObject("winmgmts:" _  
05.
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
06.
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")  
07.
For Each objItem in colItems  
08.
    Wscript.Echo "Load Percentage: " & objItem.LoadPercentage  
09.
Next 
10.
 
11.
If objItem.LoadPercentage <= 20 Then  
12.
Call ErstelleEineDatei 
13.
Else 
14.
Call Dateiloschen 
15.
End if 
16.
 
17.
Sub ErstelleEineDatei 
18.
   Dim fso, MeineDatei 
19.
   Set fso = CreateObject("Scripting.FileSystemObject") 
20.
   Set MeineDatei = fso.CreateTextFile("c:\CPUnotbusy.txt", True) 
21.
   MeineDatei.WriteLine("im moment keine codierung.") 
22.
   MeineDatei.Close 
23.
End Sub 
24.
 
25.
Sub Dateiloschen 
26.
Set fso = CreateObject("Scripting.FileSystemObject") 
27.
fso.GetFile("c:\CPUnotbusy.txt").Delete 
28.
End Sub
Allerdings funktioniert diese Script noch nicht so richtig, wenn die Last unter 20% ist, wird wohl eine Datei erzeugt, ist sie über 20% wird die Datei allerdings nicht wieder gelöscht.

Hat jemand eine Idee?
Wahrscheinlich ein dummer Fehler, hab mir VBS heute zum ersten Mal angeschaut.
Mitglied: bastla
23.08.2008 um 00:35 Uhr
Hallo megamazl!

Bedingt durch das "On Error Resume Next" wird keine Fehlermeldung angezeigt und nach der fehlerhaften Zeile einfach fortgesetzt, weswegen immer "Call ErstelleEineDatei" zum Zug kommt - Du solltest daher die "On Error"-Zeile erst nach dem (erfolgreichen ) Testen in das Script aufnehmen.

Das Problem liegt darin, dass "objItem.LoadPercentage" nur innerhalb der "For Each"-Schleife zur Verfügung steht - die entsprechende Fehlermeldung "C:\Scripts\FlagFile.vbs(11, 1) Laufzeitfehler in Microsoft VBScript: Objekt erforderlich: 'objItem' hätte dies leichter erkennbar gemacht.

Die Lösung ist aber einfach: Schreibe den entsprechenden Prozentsatz innerhalb der Schleife in eine Variable, oder setze gleich die Abfrage selbst in die Schleife.

Version 1 sähe so aus:
01.
... 
02.
For Each objItem in colItems 
03.
    LoadPercentage = objItem.LoadPercentage 
04.
    WScript.Echo  "Load Percentage: " & LoadPercentage 
05.
Next 
06.
 
07.
If LoadPercentage <= 20 Then 
08.
...
Sind das übrigens Single-Core-Prozessoren? Wenn Du mehrere Kerne zur Verfügung hast, werden in der Schleife die Werte der einzelnen Kerne nacheinander ausgegeben. Falls Du dann die Gesamtauslastung ermitteln möchtest, ginge das so:
01.
... 
02.
TotalLoadPercentage = 0 
03.
For Each objItem in colItems 
04.
    LoadPercentage = objItem.LoadPercentage 
05.
    WScript.Echo  "Load Percentage: " & objItem.LoadPercentage 
06.
    TotalLoadPercentage = TotalLoadPercentage + LoadPercentage  
07.
Next 
08.
 
09.
If TotalLoadPercentage <= 20 Then 'oder 40/80, da ja 200% oder 400% Gesamtwert möglich 
10.
...
Grüße
bastla
Bitte warten ..
Mitglied: megamazl
23.08.2008 um 21:00 Uhr
super, vielen Dank mit:
01.
On Error Resume Next  
02.
 
03.
strComputer = "."  
04.
Set objWMIService = GetObject("winmgmts:" _  
05.
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")  
06.
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")  
07.
 
08.
TotalLoadPercentage = 0  
09.
For Each objItem in colItems  
10.
    LoadPercentage = objItem.LoadPercentage  
11.
    WScript.Echo  "Load Percentage: " & objItem.LoadPercentage  
12.
    TotalLoadPercentage = TotalLoadPercentage + LoadPercentage   
13.
Next  
14.
    
15.
If TotalLoadPercentage <= 20 Then  
16.
Call ErstelleEineDatei()  
17.
Else  
18.
Call Dateiloschen()  
19.
End if  
20.
 
21.
Public Sub ErstelleEineDatei() 
22.
   Dim fso, MeineDatei 
23.
   Set fso = CreateObject("Scripting.FileSystemObject") 
24.
   Set MeineDatei = fso.CreateTextFile("c:\CPUnotbusy.txt", True) 
25.
   MeineDatei.WriteLine("im moment keine codierung.") 
26.
   MeineDatei.Close 
27.
End Sub 
28.
 
29.
Public Sub Dateiloschen() 
30.
Set fso = CreateObject("Scripting.FileSystemObject") 
31.
fso.GetFile("c:\CPUnotbusy.txt").Delete 
32.
End Sub
klappt es bestens.

Ich habe mir jetzt eine Batch geschrieben die so aussieht:
01.
:run  
02.
cpu.vbs 
03.
sleep 60 
04.
goto run
Jetzt bräuchte ich eine stop.bat die den Prozess beendet und die die evtl. vorhandene CPUnotbusy.txt löscht. Das Problem ist jetzt, wie krieg ich den jetzt die im Loop laufende cmd.exe gelöscht? Wenn ich das über den Kill Befehl laufen lassen will, funktioniert das nicht.

Danke im voraus.
Bitte warten ..
Mitglied: bastla
23.08.2008 um 21:24 Uhr
Hallo megamazl!

Jetzt bräuchte ich eine stop.bat die den Prozess beendet und die die evtl. vorhandene CPUnotbusy.txt löscht.
Welchen Prozess willst Du unter welcher Bedingung beenden?

Grüße
bastla
Bitte warten ..
Mitglied: megamazl
23.08.2008 um 21:40 Uhr
wenn ich die START.bat starte, wird ja die cpu.vbs gestartet und alle 60 Sekunden wiederholt. Die cpu.vbs startet ja als cmd.exe, da sie im Batch läuft. Und genau diese cmd.exe möchte ich mit einer STOP.bat beenden und die CPUnotbusy.txt löschen, falls diese im Moment existiert. Wenn ich aber per "kill cmd.exe" versuche die cmd.exe zu beenden passiert nichts, die STOP.bat läuft ja ebenfalls in einer cmd.exe. Ich bräuchte sozusagen einen Identifier für genau diese gestartete cmd.exe.
Bitte warten ..
Mitglied: bastla
23.08.2008 um 21:51 Uhr
Hallo megamazl!

Das ist mir nicht klar ...

Zum Einen wird die "cpu.vbs" durch "cscript.exe" oder, defaultmäßig, "wscript.exe" (nicht aber durch "cmd.exe") ausgeführt, zum Anderen läuft das VBScript ja nur einmal durch und Du hast danach eine "CPUnotbusy.txt" oder eben nicht - das kannst Du ja im Batch (vor dem "sleep") mit "if exist" abfragen und dementsprechend weiter verfahren - oder übersehe ich etwas?

Grüße
bastla
Bitte warten ..
Mitglied: megamazl
23.08.2008 um 22:05 Uhr
ja, ok, die cpu.vbs läuft natürlich im cscript.exe, aber da ja fortwährend die Prozessorlast abgefragt werden soll, um zu überprüfen ob der Rechner grade am codieren ist, soll die cpu.vbs natürlich im Loop ablaufen. Und genau diese Batchdatei (START.bat, siehe oben) läuft ja unter cmd.exe. Die START.bat soll ja wirklich stundenlang laufen während der Rechner codiert. Erst wenn der Rechner nach ca. 2 oder 3 Stunden mit dem Videofile fertig ist, soll die CPUnotbusy.txt wieder erstellt werden. Wenn ich jetzt nur die cscript.exe killen würde, würde sie im nächstem Durchgang nach sleep ja wieder erstellt würden.
Allerdings soll man auch eben mit dieser STOP.bat die laufende START.bat beenden können und damit auch die CPUnotbusy.txt löschen, damit nicht aus Versehen Dateien kopiert werden.
Bitte warten ..
Mitglied: bastla
23.08.2008 um 22:27 Uhr
Hallo megamazl!

Allerdings soll man auch eben mit dieser STOP.bat die laufende START.bat beenden können und damit auch die CPUnotbusy.txt löschen, damit nicht aus Versehen Dateien kopiert werden.
Da stellt sich natürlich die Frage: Wie wird die STOP.bat gestartet?

Trotzdem ein Ansatz:
Wenn Du in der START.bat (übrigens ist es nicht zu empfehlen, Batches Namen von CMD-Befehlen zu geben) eine Zeile
01.
title ##CheckCPU##
an den Anfang stellst, würde ein
01.
taskkill /F /FI "WINDOWTITLE eq ##CheckCPU##" /T
genügen - allerdings gibt es "taskkill" erst seit XP, und ich vermute (wissen kann ich's ja nicht ), dass Du W2000 verwendest ...

Grüße
bastla
Bitte warten ..
Mitglied: megamazl
23.08.2008 um 22:37 Uhr
juhuuuu, vielen vielen Dank, es funktioniert.
Übrigens ich hab XP Pro. wünsche die ein frohes Wochenende
Bitte warten ..
Mitglied: bastla
23.08.2008 um 22:45 Uhr
Hallo megamazl!

Übrigens ich hab XP Pro
Schade eigentlich - jetzt hätte ich gerade einen Ansatz für W2000 ...

... den ich aber trotzdem poste:
Dazu müsste die "starter.bat" mit einem Parameter gestartet werden, also etwa
01.
start starter.bat ##CheckCPU##
Danach könnte per VBScript die verwendete Commandline (bzw der relevante Teil) zum Finden und dann Terminieren (klingt weniger brutal als "Killen" ) des Prozesses verwendet werden, also etwa:
01.
strComputer = "."  
02.
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")  
03.
Set colItems = objWMIService.ExecQuery( _ 
04.
   "SELECT * FROM Win32_Process WHERE CommandLine LIKE '%##CheckCPU##%'",,48)  
05.
For Each objItem in colItems  
06.
    objItem.Terminate 
07.
Next
Natürlich sollte die Kennung (also etwa "##CheckCPU##") so gewählt werden, dass es keine Verwechslung mit einem anderen Prozess geben kann (gilt auch für die "taskkill"-Variante).

Grüße
bastla

P.S.: Auf W2000 hatte ich getippt, weil Du "kill" verwenden wolltest ...
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

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

Frage von thomasreischer zum Thema Microsoft ...

Netzwerkmanagement
gelöst Sophos UTM220 - Appliance CPU Auslastung LOG-Datei downloaden? (7)

Frage von 1410640014 zum Thema Netzwerkmanagement ...

Batch & Shell
Bash Script soll neue Datei erzeugen (2)

Frage von SpeakerST zum Thema Batch & Shell ...

Windows 7
gelöst Windows Update bei virtuellem Windows 7 - hohe CPU Auslastung und keine Reaktion (6)

Frage von IT-Alexander zum Thema Windows 7 ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...