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 {
([^{]
),即 {
之前的所有内容,但不包括 {
;通过不指定替换字符串,匹配的部分将替换为空字符串,即有效地 删除 ,最后只留下 {...}
部分。
我想请求一些帮助来提取一些从 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
如果可以做出以下假设,让我用更简单的替代方法来补充
鉴于感兴趣的子字符串看起来像是最后一个 \
分隔的标记,使用正则表达式的替代方法是将字符串视为 path并通过 Split-Path
:
# 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 {
([^{]
),即 {
之前的所有内容,但不包括 {
;通过不指定替换字符串,匹配的部分将替换为空字符串,即有效地 删除 ,最后只留下 {...}
部分。