Windows 默认开启了大量后台服务,其中很多对普通用户来说完全用不上,却在默默消耗 CPU、内存和硬盘。这篇文章分享一个用 PowerShell 写的交互式服务管理脚本,帮你安全、逐一地决定每个服务的命运。

为什么要优化 Windows 服务?
默认安装的 Windows 会运行几十个后台服务。其中有些相当”多余”:

DiagTrack(遥测服务):持续向微软发送使用数据,既占带宽又涉及隐私
SysMain(Superfetch):为机械硬盘设计的预读缓存,SSD 用户完全不需要
Spooler(打印后台):没有打印机却一直跑,还是历史上被攻击次数最多的服务之一
RemoteRegistry:允许远程修改注册表,安全隐患明显

关掉这些服务,日常使用完全不受影响,但系统响应速度、隐私保护和安全性都能得到提升。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#Requires -Version 5.1

if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Host ([char]0x9519+[char]0x8BEF+[char]0xFF1A+[char]0x8BF7+[char]0x4EE5+[char]0x7BA1+[char]0x7406+[char]0x5458+[char]0x8EAB+[char]0x4EFD+[char]0x8FD0+[char]0x884C+[char]0x6B64+[char]0x811A+[char]0x672C+[char]0xFF01) -ForegroundColor Red
Pause
Exit
}

$services = @(
@{Name="DiagTrack"; Desc=([char]0x8BCA+[char]0x65AD+[char]0x8DDF+[char]0x8E2A+[char]0xFF0F+[char]0x9065+[char]0x6D4B+[char]0x6570+[char]0x636E+[char]0x6536+[char]0x96C6); Suggest=([char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528+[char]0xFF08+[char]0x4FDD+[char]0x62A4+[char]0x9690+[char]0x79C1+[char]0xFF09)},
@{Name="dmwappushservice"; Desc=("WAP"+[char]0x63A8+[char]0x9001+[char]0x6D88+[char]0x606F+[char]0x8DEF+[char]0x7531+[char]0x670D+[char]0x52A1); Suggest=([char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528)},
@{Name="WSearch"; Desc=("Windows"+[char]0x641C+[char]0x7D22+[char]0xFF08+[char]0x6587+[char]0x4EF6+[char]0x7D22+[char]0x5F15+[char]0xFF09); Suggest=([char]0x53EF+[char]0x9009+[char]0xFF08+[char]0x673A+[char]0x5668+[char]0x8F83+[char]0x6162+[char]0x65F6+[char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528+[char]0xFF09)},
@{Name="SysMain"; Desc=("SysMain"+[char]0xFF08+"Superfetch"+[char]0x9884+[char]0x8BFB+[char]0x7F13+[char]0x5B58+[char]0xFF09); Suggest=([char]0x4F7F+[char]0x7528+"SSD"+[char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528)},
@{Name="Spooler"; Desc=([char]0x6253+[char]0x5370+[char]0x673A+[char]0x540E+[char]0x53F0+[char]0x5904+[char]0x7406+[char]0x7A0B+[char]0x5E8F); Suggest=([char]0x65E0+[char]0x6253+[char]0x5370+[char]0x673A+[char]0x65F6+[char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528)},
@{Name="WbioSrvc"; Desc=("Windows"+[char]0x751F+[char]0x7269+[char]0x8BC6+[char]0x522B+[char]0x670D+[char]0x52A1+[char]0xFF08+[char]0x6307+[char]0x7EB9+"/"+[char]0x4EBA+[char]0x8138+[char]0xFF09); Suggest=([char]0x65E0+[char]0x76F8+[char]0x5173+[char]0x786C+[char]0x4EF6+[char]0x65F6+[char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528)},
@{Name="RemoteRegistry"; Desc=([char]0x8FDC+[char]0x7A0B+[char]0x6CE8+[char]0x518C+[char]0x8868+[char]0x8BBF+[char]0x95EE+[char]0x670D+[char]0x52A1); Suggest=([char]0x5EFA+[char]0x8BAE+[char]0x7981+[char]0x7528+[char]0xFF08+[char]0x63D0+[char]0x5347+[char]0x5B89+[char]0x5168+[char]0x6027+[char]0xFF09)},
@{Name="PcaSvc"; Desc=([char]0x7A0B+[char]0x5E8F+[char]0x517C+[char]0x5BB9+[char]0x6027+[char]0x52A9+[char]0x624B+[char]0x670D+[char]0x52A1); Suggest=([char]0x53EF+[char]0x9009)}
)

$startTypeMap = @{
"Automatic" = ([char]0x81EA+[char]0x52A8)
"Manual" = ([char]0x624B+[char]0x52A8)
"Disabled" = ([char]0x5DF2+[char]0x7981+[char]0x7528)
"AutomaticDelayedStart" = ([char]0x81EA+[char]0x52A8+[char]0xFF08+[char]0x5EF6+[char]0x8FDF+[char]0x542F+[char]0x52A8+[char]0xFF09)
}

$statusMap = @{
"Running" = ([char]0x8FD0+[char]0x884C+[char]0x4E2D)
"Stopped" = ([char]0x5DF2+[char]0x505C+[char]0x6B62)
"Paused" = ([char]0x5DF2+[char]0x6682+[char]0x505C)
"Starting" = ([char]0x6B63+[char]0x5728+[char]0x542F+[char]0x52A8)
"Stopping" = ([char]0x6B63+[char]0x5728+[char]0x505C+[char]0x6B62)
}

Write-Host "==============================================" -ForegroundColor Cyan
Write-Host (" "+("Windows"+[char]0x670D+[char]0x52A1+[char]0x7BA1+[char]0x7406+[char]0x5DE5+[char]0x5177)+" ") -ForegroundColor Cyan
Write-Host "==============================================" -ForegroundColor Cyan

foreach ($svc in $services) {
Write-Host "`n"+([char]0x670D+[char]0x52A1+[char]0x540D+[char]0x79F0+[char]0xFF1A) -NoNewline
Write-Host $svc.Desc -ForegroundColor White
Write-Host ([char]0x4F18+[char]0x5316+[char]0x5EFA+[char]0x8BAE+[char]0xFF1A) -NoNewline
Write-Host $svc.Suggest -ForegroundColor Yellow

$current = Get-Service -Name $svc.Name -ErrorAction SilentlyContinue
if (-not $current) {
Write-Host ([char]0x5F53+[char]0x524D+[char]0x72B6+[char]0x6001+[char]0xFF1A+[char]0x6B64+[char]0x7CFB+[char]0x7EDF+[char]0x672A+[char]0x627E+[char]0x5230+[char]0x8BE5+[char]0x670D+[char]0x52A1+[char]0xFF0C+[char]0x8DF3+[char]0x8FC7+[char]0x3002) -ForegroundColor Gray
continue
}

$stCN = if ($startTypeMap["$($current.StartType)"]) { $startTypeMap["$($current.StartType)"] } else { "$($current.StartType)" }
$stsCN = if ($statusMap["$($current.Status)"]) { $statusMap["$($current.Status)"] } else { "$($current.Status)" }

Write-Host (([char]0x5F53+[char]0x524D+[char]0x72B6+[char]0x6001+[char]0xFF1A+"[")+([char]0x542F+[char]0x52A8+[char]0x7C7B+[char]0x578B+[char]0xFF1A)+$stCN+"] ["+([char]0x8FD0+[char]0x884C+[char]0x72B6+[char]0x6001+[char]0xFF1A)+$stsCN+"]")

$choice = Read-Host ([char]0x8BF7+[char]0x9009+[char]0x62E9+[char]0x64CD+[char]0x4F5C+[char]0xFF1A+"[1] "+[char]0x7981+[char]0x7528+" [2] "+[char]0x542F+[char]0x7528+" [3] "+[char]0x8DF3+[char]0x8FC7)

switch ($choice) {
"1" {
Write-Host ([char]0x6267+[char]0x884C+[char]0x64CD+[char]0x4F5C+[char]0xFF1A+[char]0x6B63+[char]0x5728+[char]0x7981+[char]0x7528+"...") -ForegroundColor Green
Set-Service -Name $svc.Name -StartupType Disabled -ErrorAction SilentlyContinue
Stop-Service -Name $svc.Name -Force -ErrorAction SilentlyContinue
Write-Host ([char]0x6267+[char]0x884C+[char]0x7ED3+[char]0x679C+[char]0xFF1A+[char]0x5DF2+[char]0x7981+[char]0x7528+[char]0x5E76+[char]0x505C+[char]0x6B62+[char]0x670D+[char]0x52A1+[char]0x3002) -ForegroundColor Green
}
"2" {
Write-Host ([char]0x6267+[char]0x884C+[char]0x64CD+[char]0x4F5C+[char]0xFF1A+[char]0x6B63+[char]0x5728+[char]0x542F+[char]0x7528+"...") -ForegroundColor Green
Set-Service -Name $svc.Name -StartupType Automatic -ErrorAction SilentlyContinue
Start-Service -Name $svc.Name -ErrorAction SilentlyContinue
Write-Host ([char]0x6267+[char]0x884C+[char]0x7ED3+[char]0x679C+[char]0xFF1A+[char]0x5DF2+[char]0x542F+[char]0x7528+[char]0x5E76+[char]0x542F+[char]0x52A8+[char]0x670D+[char]0x52A1+[char]0x3002) -ForegroundColor Green
}
"3" { Write-Host ([char]0x6267+[char]0x884C+[char]0x64CD+[char]0x4F5C+[char]0xFF1A+[char]0x5DF2+[char]0x8DF3+[char]0x8FC7+[char]0x3002) -ForegroundColor Gray }
default { Write-Host ([char]0x6267+[char]0x884C+[char]0x64CD+[char]0x4F5C+[char]0xFF1A+[char]0x8F93+[char]0x5165+[char]0x65E0+[char]0x6548+[char]0xFF0C+[char]0x81EA+[char]0x52A8+[char]0x8DF3+[char]0x8FC7+[char]0x3002) -ForegroundColor Red }
}
}

Write-Host "`n==============================================" -ForegroundColor Cyan
Write-Host ([char]0x5B8C+[char]0x6210+[char]0xFF01+[char]0x5EFA+[char]0x8BAE+[char]0x91CD+[char]0x542F+[char]0x7535+[char]0x8111+[char]0x4EE5+[char]0x4F7F+[char]0x66F4+[char]0x6539+[char]0x751F+[char]0x6548+[char]0x3002) -ForegroundColor Cyan
Write-Host "==============================================" -ForegroundColor Cyan
Read-Host ([char]0x6309+" Enter "+[char]0x952E+[char]0x9000+[char]0x51FA)

使用方法:

1.将代码保存为 ServiceOptimizer.ps1。
2.打开 PowerShell(管理员),执行:
powershellpowershell -ExecutionPolicy Bypass -File “.\ServiceOptimizer.ps1”

如果想永久调整执行策略,可以先运行:
powershellSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
之后直接双击或 .\ServiceOptimizer.ps1 即可。

也可以右键文件,先解除安全限制,再打开和上述效果一致

3.脚本会逐个弹出服务信息,输入 1(禁用)、2(启用)或 3(跳过),回车确认。全部完成后重启电脑。

脚本需要管理员权限才能修改服务状态
禁用服务前请确认自己确实用不到(例如:禁用 Spooler 前确认没有打印需求)
所有操作均可通过选择 [2] 启用 恢复,不会造成永久损坏
修改完成后建议重启以确保设置生效