向服务控制管理器提交启动请求,可预览、捕获错误并返回服务对象。
Start-Service 按服务名或 ServiceController 对象启动服务,默认不输出结果,-PassThru 返回 ServiceController;支持 -WhatIf/-Confirm,别名是 sasv。它把启动请求交给 SCM 后返回,服务可能仍处于 StartPending,需要就绪确认时用 WaitForStatus('Running', ...) 轮询。
管道:接受 ServiceController 对象按值输入,也接受 Name 按属性名绑定,所以 Get-Service ... | Start-Service 可用。权限:通常需要管理员,或服务安全描述符显式授予启动权限;普通用户对多数服务会收到“拒绝访问”。
边界:启动类型为 Disabled 的服务无法直接启动,依赖服务不可用、服务账户登录失败、可执行路径错误都会让启动失败,错误往往只给一个笼统的“无法启动服务”,细节在系统事件日志。版本:5.1 与 7.x 都仅限 Windows;7.x 通过同一服务模块工作,非 Windows 平台没有该命令。
# 1. 预览启动操作,确认服务名和影响
PS C:\> Start-Service -Name Spooler -WhatIf
# 2. 启动后等待真正进入 Running,避免竞态
PS C:\> Start-Service -Name Spooler; (Get-Service Spooler).WaitForStatus('Running', [TimeSpan]::FromSeconds(10))
# 3. 从查询结果批量启动,服务不存在时静默跳过
PS C:\> Get-Service -Name 'SQLSERVERAGENT' -ErrorAction SilentlyContinue | Start-Service
# 4. 捕获服务名错误,脚本不会只打印红字后继续
PS C:\> try { Start-Service -Name 'NotExist' -ErrorAction Stop } catch { $_.Exception.Message }
# 5. 启动所有已停止的 SQL 相关服务,并显示结果
PS C:\> Get-Service | Where-Object { $_.Name -like 'SQL*' -and $_.Status -eq 'Stopped' } | Start-Service -PassThru | Select-Object Name, Status
# 6. 启动时间服务并立即查看状态
PS C:\> Start-Service -Name W32Time -PassThru | Select-Object Name, Status
Disabled 时,Start-Service 会失败;先 Get-Service <名> | Select StartType,确认后再由管理员把启动类型改为 Manual/Automatic。Status 可能还是 StartPending,随后失败。用 WaitForStatus('Running', ...) 或轮询确认。Get-Service -Name <名> -RequiredServices 检查,再按依赖顺序启动。Start-Service 而变快;先修服务自身启动逻辑。Start-Service;跨平台脚本要用 $IsWindows 分支,不能假定服务模型存在。Get-Service — 先确认状态、启动类型和依赖。Stop-Service — 停止服务并处理依赖。sc — 用 sc.exe start 或查询服务配置。Get-Process — 观察服务宿主进程是否真正起来。合上页面,先回答,再展开对照。
Start-Service 返回后,服务一定已经处于 Running 吗?Disabled 的服务,直接 Start-Service 会怎样?StartPending,需要用 WaitForStatus 或轮询确认。Disabled 禁止 SCM 启动,需要管理员先改启动类型。
小程序版
微信扫码,随时查命令