开机启动VBS脚本:以管理员权限启动程序并设置进程优先级
解决VBS启动管理员程序并设置进程优先级的问题
嘿,你已经搞定了管理员启动程序的核心部分,只差最后一步调整进程优先级啦!问题在于ShellExecute启动程序后没法直接拿到进程句柄,所以我们需要借助WMI(Windows管理规范)来找到刚启动的进程,再修改它的优先级。
下面是完整的可运行代码,我帮你整合了启动+优先级设置的逻辑:
Set app = CreateObject("Shell.Application") ' 以管理员权限最大化启动目标程序(保留你原来的参数) app.ShellExecute """d:\SYNC\Dropbox\PORTABLE_PROGRAMS\ahk\Navigare\KeyboardEnchancer\KeyboardEnchancer.exe""", , , "runas", 3 ' 给程序一点启动时间,避免还没加载就查找不到进程 ' 可以根据程序启动速度调整这个数值(单位:毫秒) WScript.Sleep 2000 ' 调用WMI获取系统进程列表 Set wmiService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") ' 精确查找目标进程:同时匹配进程名和完整路径,避免同名进程干扰 Set targetProcesses = wmiService.ExecQuery( _ "SELECT * FROM Win32_Process WHERE " & _ "Name='KeyboardEnchancer.exe' AND " & _ "ExecutablePath='d:\\SYNC\\Dropbox\\PORTABLE_PROGRAMS\\ahk\\Navigare\\KeyboardEnchancer\\KeyboardEnchancer.exe'" _ ) ' 遍历找到的进程,设置优先级 For Each proc In targetProcesses ' 这里可以根据需求替换优先级数值: ' - 低于正常: 16384 ' - 正常: 32 ' - 高于正常: 32768 (你要的选项) ' - 高优先级: 128 ' - 实时: 256 proc.SetPriority(32768) WScript.Echo "成功设置进程优先级为「高于正常」" Next
几个关键细节说明:
- 等待时间:
WScript.Sleep 2000是给程序留2秒启动时间,如果你的程序启动慢,可以改成3000(3秒)甚至更长,确保进程已经加载完成。 - 精确查找进程:用
ExecutablePath匹配完整路径,能避免系统中其他同名进程被误改优先级,比只搜进程名更可靠。 - 优先级数值:Windows系统定义了固定的优先级常量,上面的代码注释里已经列了常用选项,直接替换数值就能切换优先级。
- 权限问题:因为你已经用
runas以管理员身份启动程序,所以调整进程优先级的权限是足够的,不用额外提权。
如果运行时还是找不到进程,可以先测试下等待时间是否足够,或者检查ExecutablePath里的路径转义是否正确(VBS里路径的反斜杠要写两次\\)。
内容的提问来源于stack exchange,提问作者Ciprian Dragoe




