如何从WMI进程解析文件夹路径?

时间:2018-01-26 18:00:30

标签: regex powershell

我需要能够从已安装的Windows服务解析文件夹路径(可能会有所不同)。

在PowerShell中使用

$serviceToRemove = Get-WmiObject -Class Win32_Service -Filter "name='Labelary'"

我可以获得该对象,如果我这样做

$ serviceToRemove.PathName

它给出了

c:\program files\myapplicationname\mybinary.exe //rs/labelry

我需要

c:\program files\myapplicationname

我尝试了各种拆分组合,但路径可能会有所不同或有空格。

是否有正则表达式获取此部分路径。唯一有保证的模式是我希望字符串中的部分位于通配符* .exe之前。但我不知道如何在PowerShell中表达这一点。我在正则表达式测试器中尝试\w*\.exe,但这只返回mybinary.exe

PowerShell或System.IO路径工具的各种组合似乎都认为//rs/labelry是路径的一部分,因此无法正确返回根。

2 个答案:

答案 0 :(得分:2)

我可能会这样写:

$pathName = Get-WmiObject Win32_Service -Filter "Name='Labelary'" |
  Select-Object -ExpandProperty PathName |
  Select-String '^"?(.+)\.exe' | ForEach-Object {
    Split-Path $_.Matches[0].Groups[1].Value -Parent
  }

答案 1 :(得分:1)

这样的事情应该有效:

$path = if ($serviceToRemove.PathName -match '[a-z]:\\.*?(?=\\[^\\]+\.exe)') {
    $matches[0]
}

正则表达式匹配驱动器号([a-z]:\\)加上反斜杠后跟可执行文件名(\\[^\\]+\.exe)之前的最短字符序列。正向前导断言((?=...))确保反斜杠和可执行文件名不包含在返回的字符串中。