Windows - Processz prioritás váltás szkriptekből

forráskód letöltése
Szkriptekből bármilyen futó program, processzor prioritását meg lehet változtatni. Elindítunk egy alkalmazás szkriptből, egy adott feladat kezdetekor megemeljük a prioritást, majd a munka végeztével visszaállítjuk a normál állapotot. Az eredmény: gyorsabb futás. Alábbi példánkban egy olyan Windows függvényt hívunk meg, melyet programokból is fel lehet használni.
Cikkünkhöz mellékeltük az alábbi szkriptet "ChangePriority.vbs" néven. Indítsuk el egy "Jegyzettömb" ("Notepad") példányt és futtassuk a szkriptet. Ezután nézzük meg a "Feladatkezelő"-vel ("Task Manager") a prioritást - normál feletti lesz.
Első lépésben deklaráljunk egy változót a normál feletti (above normal) prioritáshoz és adjuk értéknek a 32768-at. Hogy jön ki ez a szám?
A prioritásokat a mellettük lévő értékek azonosítják:
  • alacsony (idle) = 64
  • normál alatti (below normal) = 16384
  • normál (normal) = 32
  • normál feletti (above normal) = 32768
  • magas (high priority) = 128
  • valós idejű (realtime) = 256
Const ABOVE_NORMAL = 32768
A prioritásváltást a helyi gépen végezzük el (.), de nincs akadálya, hogy egy a hálózatban elérhető másik gépen hajtsuk végre. Egyetlen dolgot kell csupán figyelembe venni: a szkriptet futtató felhasználónak elegendő jogosultsággal kell rendelkeznie mind helyileg, mind a másik gépen. Ha nem teljesül ez a feltétel, hibaüzenetet kapunk. Távoli gépen való futtatáshoz át kell írni az "strComputer" változó tartalmát a gép nevét megadva.
strComputer = "."
Kapcsolatot kell teremtenünk a WMI (Windows Management Instrumentation) szolgáltatás \root\cimv2 névterével, mert itt található a Win32_Process osztály, mely alkalmas a prioritásváltás elvégzésére.
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Futtatunk egy WQL (WMI Query Language) lekérdezést a Win32_Process osztályon és lekérjük az összes objektumot, melynek a neve: "Notepad.exe". Ezzel gyakorlatilag birtokában vagyunk az összes futó jegyzettömbnek.
Set colProcesses = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = 'Notepad.exe'")
Lehet, hogy nem csak egy példányban fut, ezért egy FOR ciklust alkalmazunk és az összes példánynál átállítjuk a prioritást.
For Each objProcess in colProcesses
A váltás a "SetPriority" metódussal lehetséges, paraméterként az első sorban deklarált konstanst adjuk át, majd zárjuk a ciklust.
 objProcess.SetPriority(ABOVE_NORMAL) 
Next
Természetesen más prioritást is be lehet állítani, csupán a konstans értékét kell módosítani.
A lekérdezésnél a "Name" tulajdonság mindig az elérendő folyamat indító .EXE fájljának a neve.