我需要能够从已安装的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
是路径的一部分,因此无法正确返回根。
答案 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
)之前的最短字符序列。正向前导断言((?=...)
)确保反斜杠和可执行文件名不包含在返回的字符串中。