Windows Scripting Host: Prozesse mit bestimmter Priorität starten

Für viele Aufgaben ist der Windows Scripting Host (WSH) eine bessere Methode, als eine klassische Batch-Datei, weil man hierbei viel mächtigere Funktionen zur Verfügung hat.

Ein Problem ist jedoch der Start von Tochterprozessen mit einer bestimmen Priorität. Die entsprechenden Script-Kommandos Run und Exec haben zwar einen Parameter für den Windows-Stil, jedoch nicht für die Priorität.

Das folgende Skript liefert Ihnen zwei Funktionen, um dem abzuhelfen.

StartCmd nimmt als dritten Parameter (neben dem Kommando und dem Windows-Stil) die Priorität. Die niedrigste Stufe ist hierbei Idle. Hier wird dem Prozess nur dann Rechenzeit zugeteilt, wenn die CPU ansonsten nichts zu tun hat. StartCmd liefert die ID des gestarteten Prozesses zurück.

StartCmd führt das Kommando aus und macht sofort mit der Ausführung des WSH-Skript weiter. Die Funktion WaitForEndOfCmd erwartet eine Prozess-ID als Parameter und wartet dann solange, biss der der Prozess endet. Um also beispielsweise den Editor notepad.exe auszuführen und erst dann im Skript weiterzumachen, wenn er beendet wird, würden sie schreiben:

WaitForEndOfCmd(StartCmd(“notepad.exe”,NORMAL_WINDOW, PRIORITY_NORMAL))

Hier die beiden Funktionen StartCmd und WaitForEndOfCmd sowie benötigte Konstanten als VB-Skript realisiert:

Const PRIORITY_BELOWNORMAL = 16384

Const PRIORITY_IDLE=64

Const NORMAL_WINDOW = 1

Const HIDE_WINDOW = 0

Function StartCmd(astrCommand,alngWindowStyle,alngPriority)

  Dim objWMIService,objStartup,objConfig,objProcess,intProcessID,intReturn

  Set objWMIService = GetObject(“winmgmts:” &_

  “{impersonationLevel=impersonate}!\.rootcimv2”)

  Set objStartup = objWMIService.Get(“Win32_ProcessStartup”)

  Set objConfig = objStartup.SpawnInstance_

  objConfig.ShowWindow = alngWindowStyle

  objConfig.PriorityClass = alngPriority

  Set objProcess = objWMIService.Get(“Win32_Process”)

  

  intReturn = objProcess.Create(astrCommand, Null, objConfig, intProcessID)

  StartCmd = intProcessID

  

  Set objProcess = Nothing

  Set objConfig = Nothing

  Set objStartup = Nothing

  Set objWMIService = Nothing

End Function

Function WaitForEndOfCmd(aintProcessID)

Dim objWMIService,colMonitorProcess,objLatestEvent

On Error Resume Next

  Set objWMIService = GetObject(“winmgmts:” _

   & “{impersonationLevel=impersonate}!\.rootcimv2”)

  If Err.Number <> 0 Then

   cscript.echo “Fehler beim Ermitteln WMI-Objekt : ” & Err.Description

   WScript.Quit

  End If

  

  Set colMonitorProcess = objWMIService.ExecNotificationQuery _

   (“SELECT * FROM __InstanceDeletionEvent ” & _

   “WITHIN 1 WHERE TargetInstance ISA ‘Win32_Process’ ” & _

   “AND TargetInstance.ProcessId = ‘” & aintProcessID & “‘”)

  If Err.Number <> 0 Then

   cscript.echo “Fehler beim Warten auf Prozess-Ende: ” & Err.Description

   Err.Clear

  End If

  

  ‘ wait for completion

  Set objLatestEvent = colMonitorProcess.NextEvent

  On Error GoTo 0

  Set objLatestEvent = Nothing

  Set colMonitorProcess = Nothing

  Set objWMIService=Nothing

End Function

Ähnliche Beiträge