如何在PowerShell中移除数组最后一个元素获取Windows服务安装目录
如何通过PowerShell获取Windows服务的安装目录(以Redis为例)
问题场景
我想用PowerShell获取Windows服务的信息,以Redis服务为例:
- 当前使用以下命令可获取包含执行文件的完整路径:
Get-WmiObject win32_service |?{$_.Name -like 'redis*'} | Select-Object Name, DisplayName, state, startmode, @{Name="Path"; Expression={$_.PathName.split('"')}}| convertto-json
返回的JSON结果:
{ "Name": "Redis", "DisplayName": "Redis", "state": "Running", "startmode": "Auto", "Path": "C:\\Program Files\\Redis\\redis-server.exe" }
- 但我需要的是仅包含安装目录的路径
C:\Program Files\Redis,尝试了以下命令:
Get-WmiObject win32_service |?{$_.Name -like 'redis*'} | Select-Object Name, DisplayName, state, startmode, @{Name="Path"; Expression={$_.PathName.split('"')[1].split('\\')[0..3]}}| convertto-json
返回结果中Path为数组形式,不符合需求:
{ "Name": "Redis", "DisplayName": "Redis", "state": "Running", "startmode": "Auto", "Path": { "value": [ "C:", "Program Files", "Redis", "redis-server.exe" ], "Count": 4 } }
想知道能否通过类似...split('\\')[0..length-1]的方式动态移除数组最后一个元素来实现需求?
解决方案
方法1:动态截取数组(实现你想要的方式)
可以通过$array[0..($array.Length-2)]截取到倒数第二个元素,再用-join '\'拼接成路径字符串,修改后的命令如下:
Get-WmiObject win32_service | Where-Object {$_.Name -like 'redis*'} | Select-Object Name, DisplayName, state, startmode, @{ Name="Path"; Expression={ $exePath = $_.PathName.split('"')[1] $pathParts = $exePath.split('\') $pathParts[0..($pathParts.Length-2)] -join '\' } } | ConvertTo-Json
该命令先提取带引号的完整exe路径,拆分后去掉最后一个元素(exe文件名),再拼接成目录路径。
方法2:使用.NET [System.IO.Path]类(更稳妥)
直接调用.NET的路径处理类获取目录,比手动拆分更可靠,能处理各种特殊路径情况(如含空格、转义字符的路径):
Get-WmiObject win32_service | Where-Object {$_.Name -like 'redis*'} | Select-Object Name, DisplayName, state, startmode, @{ Name="Path"; Expression={ # 去除路径首尾的引号 $exePath = $_.PathName -replace '^"|"$', '' # 获取文件所在目录 [System.IO.Path]::GetDirectoryName($exePath) } } | ConvertTo-Json
此方法无需手动拆分数组,借助现成API实现,稳定性更高。
内容的提问来源于stack exchange,提问作者user20732118
相关产品推荐
相关产品推荐

