PowerShell获取服务StartType异常:Win2012无法输出至文件求助
解决Windows Server 2012中PowerShell脚本无法输出服务StartType的问题
我之前处理过类似的跨系统PowerShell服务扫描问题,你的情况大概率是不同系统下PowerShell对服务对象的属性序列化/格式化规则差异导致的,下面给你几个针对性的解决方案:
1. 明确指定输出属性,避免依赖默认格式化
Windows 7和Windows Server 2012上,PowerShell对Get-Service返回的ServiceController对象的默认显示属性集合不一样——在Win7上默认包含了StartType,但在2012上可能没把它纳入默认输出列表,所以直接导出文件时就丢失了这个字段。
解决办法是用Select-Object明确列出你需要的所有属性,强制包含StartType,再导出:
# 示例:扫描单台计算机并导出到TXT $computer = "TargetServer" Get-Service -ComputerName $computer | Select-Object Name, DisplayName, Status, StartType | Out-File "services_$computer.txt" # 如果是导出CSV,用这个更规范 Get-Service -ComputerName $computer | Select-Object Name, DisplayName, Status, StartType | Export-Csv "services_$computer.csv" -NoTypeInformation
这样不管在哪台系统上,只要服务对象存在StartType属性,就会被强制输出到文件里。
2. 改用CIM/WMI获取服务信息,提升跨系统兼容性
Get-Service的底层实现在不同Windows版本上有细微差异,而基于标准WMI的Get-CimInstance(或旧版的Get-WmiObject)跨系统一致性更好。注意Win32_Service类里的启动类型属性是StartMode,状态是State,和Get-Service的属性名略有不同:
$computer = "TargetServer" Get-CimInstance -ClassName Win32_Service -ComputerName $computer | Select-Object Name, DisplayName, State, StartMode | Out-File "services_$computer.txt"
用CIM的好处是,不管你是PSv4还是PSv5,不管是Win7还是2012,返回的属性结构都是标准的,不会出现属性丢失的情况。
3. 排查输出编码问题(可选)
虽然这个可能性不大,但如果你的输出文件打开后有乱码或部分内容缺失,可以尝试指定Out-File的编码:
... | Out-File "services_$computer.txt" -Encoding UTF8
确保文件编码在不同系统下能正常解析。
内容的提问来源于stack exchange,提问作者Kade Williams
相关产品推荐
相关产品推荐

