Trim Get-Package 查询返回的字符串

Trim string returned from Get-Package query

我想请求一些帮助来提取一些从 Powershell 查询返回的字符。

查询是:

$x = Get-Package -Provider "Programs" -Name "*SomeWindowsApplication*" | Select-Object -Property FastPackageReference | Out-String

返回格式为

FastPackageReference
---------------------
hklm32\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{80F3CCC1-BBAF-45DD}

我试图提取(到一个变量){ } 大括号

中返回的值

使用时 $x.TrimStart("hklm32") 要么 $x.Trim("hklm32") 两者似乎都没有对字符串进行任何更改。

我已经使用 $x.GetType()

测试它是一个字符串

我需要的结果是一个变量,例如:$appvalue 查询时 returns 的值例如:{80F3CCC1-BBAF-45DD} 包括 { } 括号。

谢谢,非常感谢您的帮助。

更新:我的一位同事建议使用此代码,该代码有效,但它假定 GUID 始终为 38 个字符。 (虽然对于这个应用程序可能不是问题)

$GUID=$x.substring($x.IndexOf("{"),38)

Regex101.com - Result using REGEX

首先需要去掉 | Out-String,因为你要的是属性里面的 FastPackageReference

尝试:

$x = Get-Package -Provider "Programs" -Name "*SomeWindowsApplication*" | Select-Object -Property FastPackageReference
$guid = ([regex]'(?i){([\dA-F-]+)}$').Match($x.FastPackageReference).Groups[1].Value

# expand the property, so $x will only have the value, not an object with property FastPackageReference
$x = Get-Package -Provider "Programs" -Name "*SomeWindowsApplication*" | Select-Object -ExpandProperty FastPackageReference
$guid = ([regex]'(?i){([\dA-F-]+)}$').Match($x).Groups[1].Value

变量 $guid 现在具有值 80F3CCC1-BBAF-45DD

正则表达式详细信息:

{               Match the character “{” literally
(               Match the regular expression below and capture its match into backreference number 1
   [\dA-F-]     Match a single character present in the list below
                A single digit 0..9
                A character in the range between “A” and “F”
                The character “-”
      +         Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
}               Match the character “}” literally
$               Assert position at the end of a line (at the end of the string or before a line break character)

(?i) 使正则表达式工作 case-insensitively

如果可以做出以下假设,让我用更简单的替代方法来补充 , which shows advanced regex 技术:

鉴于感兴趣的子字符串看起来像是最后一个 \ 分隔的标记,使用正则表达式的替代方法是将字符串视为 path并通过 Split-Path:

提取其 leaf (file-name) 组件
# Get the property value(s) of interest.
$x = (Get-Package -Provider Programs -Name *SomeWindowsApplication*).FastPackageReference

# -> '{80F3CCC1-BBAF-45DD}', with your sample data
Split-Path -Leaf $x 

更简洁的regex-solution也是可能的,使用-replace操作:

$x -replace '^[^{]+'

正则表达式从输入字符串的开头 (^) 匹配一个或多个字符 (+) not { ([^{]),即 { 之前的所有内容,但不包括 {;通过不指定替换字符串,匹配的部分将替换为空字符串,即有效地 删除 ,最后只留下 {...} 部分。