我试图获取名称包含空格的服务列表,例如 SQL Server 服务。令我惊讶的是,以下语句没有返回单个记录。似乎空格具有特殊含义,并没有像我预期的那样按字面意思进行解析。
get-service | where-object name -match 'sql server'
PowerShell 匹配包含空格的字符串的规范方法是什么?
答案1
Windows 服务控制管理器 (SCM) 负责管理服务数据库。当您创建新服务时,使用命令行工具sc.exe
或直接使用 SCM Windows API 调用,例如 (创建服务A) 您可以指定ServiceName
和DisplayName
。
服务名称
要安装的服务的名称。最大字符串长度为 256 个字符。服务控制管理器数据库会保留字符的大小写,但服务名称比较始终不区分大小写。正斜杠 (/) 和反斜杠 () 不是有效的服务名称字符。
显示名称
用户界面程序用来识别服务的显示名称。此字符串的最大长度为 256 个字符。服务控制管理器中的名称保留大小写。显示名称比较始终不区分大小写。
如果您在注册表中查看由 SCM 维护的服务列表,您将看到ServiceName
以下项下的值作为唯一值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[服务名称]
当您使用 SC.exe 等工具或 VBScript、PowerShell 等脚本语言与 SCM 交互时,您通常(但并非总是)必须使用值ServiceName
而不是DisplayName
查询/停止/启动等......
当您查看 MMC 服务管理单元 (services.msc) 时,该Name
列实际上是DisplayName
服务的而不是值ServiceName
。
Services
任务管理器中的选项卡确实显示了两者,但它仍然令人困惑,因为该列Description
不是服务的描述(服务也可以有描述)而是ServiceName
。可以理解它们混淆了。