You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:43:12