【问题标题】:Get matching strings in a variable获取变量中的匹配字符串
【发布时间】:2018-06-25 06:06:26
【问题描述】:

我正在尝试从变量中获取匹配的字符串。

例如,

$out = "Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\{F1E1501C-B95C-42E0-BFD4-757DF1B961D1}"

我需要"{ }" 中的值。

【问题讨论】:

  • 到目前为止您尝试过什么,为什么没有按需要工作?你知道你可以使用正则表达式来得到想要的结果吗?
  • ... 或 -split 或 ...
  • @Olaf 我是 power shell 新手,到目前为止我已经 google 了,如何使用正则表达式,你能解释一下 $out = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall * |选择字符串 -pattern "zTPFGI" @{UninstallString=RunDll32 C:\PROGRA~2\COMMON~1\INSTAL~1\engine\6\INTEL3~1\Ctor.dll,LaunchSetup "C:\Program Files (x86) \InstallShield 安装信息\{F1E1501C-B95C-42E0-BFD4-757DF1B961D1}\setup.exe" -l0x9 FromAddRemove;显示名称=zTPFGI; LogFile=C:\Program Files (x86)\InstallShield 安装信息\{F1E1501C-B95C-42E0-BFD4-757DF1B961D1}\setup.ilg}
  • @LievenKeersmaekers
  • @jerry 您应该将此解释添加到您的实际问题中。在那里甚至可以很好地格式化它。

标签: powershell


【解决方案1】:

您可以为此使用正则表达式:

$out = "Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall{F1E1501C-B95C-42E0-BFD4-757DF1B961D1}"

$out -match "^.*{(?<guid>.*)}$" | Out-Null

然后您可以像这样访问该值:

$matches.Guid

-match 生成一个布尔值,让您知道它是否成功。在这里,我将其发送至Out-Null 将其丢弃,但您可以使用它来决定是否继续,例如将其包装在if 中:

if ($out -match "^.*{(?<guid>.*)}$")
{
   # Do something
}

请注意,您可以使用此处提到的模式获得更准确的 GUID 匹配:

RegEx for GUID

【讨论】:

  • $out = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall* | select-string -pattern "zTPFGI" 我不知道 GUID 我已使用上述命令获取 GUID
  • @jerry 请重新阅读答案。 (?&lt;foo&gt;...) 是命名捕获组的正则表达式语法,因此您可以按名称($matches['foo']$matches.foo)而不是按索引($matches[1])访问组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2020-03-19
  • 1970-01-01
相关资源
最近更新 更多