如何为PowerShell脚本添加实例名参数以停止指定SQL Server服务
SQL Server 服务停止脚本自动化适配方案
背景说明
- 最初编写的默认实例停止脚本硬编码了固定服务名,代码如下:
Get-Service -Name 'MSSQLSERVER' | Stop-Service -Force -Verbose Get-Service -Name 'SQLSERVERAGENT' | Stop-Service -Force -Verbose Get-Service -Name 'SQLBrowser' | Stop-Service -Force -Verbose Get-Service -Name 'SQLTELEMETRY' | Stop-Service -Verbose Get-Service -Name 'SQLWriter' | Stop-Service -Force -Verbose
- 实际部署环境中如果是命名实例,需要手动调整服务名格式,以实例名
CELCAT为例,调整后的硬编码脚本如下:
Get-Service -Name 'MSSQL$CELCAT' | Stop-Service -Force -Verbose Get-Service -Name 'SQLAgent$CELCAT' | Stop-Service -Force -Verbose Get-Service -Name 'SQLBrowser' | Stop-Service -Force -Verbose Get-Service -Name 'SQLTELEMETRY$CELCAT' | Stop-Service -Force -Verbose Get-Service -Name 'SQLWriter' | Stop-Service -Force -Verbose
- 当前痛点:硬编码实例名的方式需要每次适配不同服务器时手动修改代码,需要实现脚本自动化识别实例,无需手动调整服务名。
自动化实现思路
根据SQL Server固定的服务命名规则实现自动匹配:
- 核心数据库服务:默认实例固定为
MSSQLSERVER,命名实例统一格式为MSSQL$<实例名> - SQL代理服务:默认实例固定为
SQLSERVERAGENT,命名实例统一格式为SQLAgent$<实例名> - 遥测服务:默认实例固定为
SQLTELEMETRY,命名实例统一格式为SQLTELEMETRY$<实例名> - 公共服务:
SQLBrowser、SQLWriter与具体实例无关,所有SQL部署环境下逻辑一致
实现逻辑为:先自动扫描本机所有符合命名规则的SQL核心服务,自动提取实例名,拼接关联服务名列表,最后统一执行停止操作,全程无需手动硬编码实例名。
可直接运行的自动化脚本
param( # 可选参数:传入指定要停止的实例名,不传则自动匹配本机所有SQL实例 [string]$TargetInstance ) $servicesToStop = @() # 如果指定了目标实例,直接拼接对应服务名 if ($TargetInstance) { $servicesToStop += "MSSQL`$$TargetInstance" $servicesToStop += "SQLAgent`$$TargetInstance" $servicesToStop += "SQLTELEMETRY`$$TargetInstance" } else { # 未指定实例时,自动扫描所有SQL核心服务(默认+所有命名实例) $sqlCoreServices = Get-Service | Where-Object { $_.Name -match '^MSSQLSERVER$|^MSSQL\$' } foreach ($coreSvc in $sqlCoreServices) { if ($coreSvc.Name -eq 'MSSQLSERVER') { # 匹配到默认实例,拼接对应服务名 $servicesToStop += 'SQLSERVERAGENT' $servicesToStop += 'SQLTELEMETRY' } else { # 匹配到命名实例,提取实例名并拼接对应服务名 $instanceName = $coreSvc.Name -replace '^MSSQL\$', '' $servicesToStop += "SQLAgent`$$instanceName" $servicesToStop += "SQLTELEMETRY`$$instanceName" } # 加入核心服务本身 $servicesToStop += $coreSvc.Name } } # 加入与实例无关的公共服务 $servicesToStop += 'SQLBrowser' $servicesToStop += 'SQLWriter' # 服务名去重 $servicesToStop = $servicesToStop | Sort-Object -Unique # 逐个停止存在的服务,自动忽略不存在的服务避免报错 foreach ($svcName in $servicesToStop) { $svc = Get-Service -Name $svcName -ErrorAction SilentlyContinue if ($svc) { Stop-Service -Name $svc.Name -Force -Verbose } }
脚本说明
- 无参数运行时,脚本自动识别本机所有安装的SQL Server实例(含默认实例、多命名实例),批量停止所有相关服务,不需要手动修改任何代码
- 仅需停止单台指定实例时,运行脚本时传入对应实例名即可,例如执行
.\Stop-SqlService.ps1 -TargetInstance CELCAT - 脚本自动跳过不存在的服务,不会因为未安装代理、遥测等可选组件导致执行中断
- 拼接服务名时使用反引号转义
$符号,避免PowerShell将$后的内容识别为变量导致服务名匹配错误
内容的提问来源于stack exchange,提问作者Marcello Miorelli
相关产品推荐
相关产品推荐

