Azure VM执行Get-Service命令异常:缺启动类型且列序错误
关于Azure Run Command执行Get-Service脚本丢失StartType的问题
嘿,这个问题其实和Azure本身没关系,是PowerShell的属性细节搞的鬼,我来给你拆解清楚:
为什么会出问题?
Get-Service返回的是ServiceController对象,这个对象里根本没有StartType这个属性——启动类型是属于WMI/CIM服务对象的专属属性,ServiceController只提供了服务的运行状态、名称、显示名这些基础信息。当你在Select-Object里指定一个不存在的属性时,PowerShell会硬塞一个空列进去,同时因为这个属性不存在,输出的列顺序就会乱掉,这就是你看到的现象。
怎么解决?
换成能获取完整服务属性的CIM命令就行,给你两种靠谱的写法:
写法一:直接用Get-CimInstance(推荐,效率更高)
Get-CimInstance -ClassName Win32_Service | Select-Object -Property Name, Status, DisplayName, StartType
这个命令直接从系统的WMI服务里拉取全量信息,StartType是它的标准属性,返回的启动类型(Auto/Manual/Disabled这些)会准确显示,而且列顺序完全按照你指定的来。
写法二:结合Get-Service和CIM关联查询
如果你更习惯用Get-Service开头,也可以通过服务名称关联查启动类型:
Get-Service | ForEach-Object { $cimService = Get-CimInstance Win32_Service -Filter "Name='$($_.Name)'" [PSCustomObject]@{ Name = $_.Name Status = $_.Status DisplayName = $_.DisplayName StartType = $cimService.StartType } }
这个脚本先拿到基础服务信息,再逐个查对应的CIM对象提取启动类型,最后输出一个自定义的结构化对象,保证列和值都准确。
小提示
在Azure Run Command里执行的时候,确保目标VM的PowerShell版本支持Get-CimInstance(现在大部分Windows VM都没问题)。如果想要输出更整齐的表格,可以在脚本最后加| Format-Table -AutoSize;要是打算导出成CSV这类结构化数据,就保留Select-Object的输出就行。
内容的提问来源于stack exchange,提问作者karthik_varma_k
相关产品推荐
相关产品推荐

