使用 Powershell 检查字符串中的特定单词是否包含大写字母

Check if a specific word in a string contains capital using Powershell

我正在使用 get-childitem-recurse 选项检查注册表项。我将其传送到 Get-ItemProperty,我正在其中寻找字符串值的特定值。然后我选择那个对象。我想进一步增强我的脚本以添加 If 语句。我只想做一些事情如果我的字符串中的一个单词包含大写字母。诀窍是,只有那个特定的词,没有其他词。

我的字符串值看起来像这样:Https:\Blah.blah.com

所以在上面,如果 "https" 包含大写,则只有 if 语句为真。上面,它确实包含一个首都。但是,如果值 returned 类似于 https:\CapitalLettersHereareOK.com。那么 If 语句应该 return false.

我不能使用 -cmatch,因为虽然它有效,但它会匹配整个字符串。如上所述,字符串中的一些字母可能是大写的,这没关系。我只需要知道 "HTTPS" 是否包含任何大写字母。

我不擅长正则表达式,但我很确定这里需要正则表达式。请参阅下面的代码:

$GetWebValue = Get-ChildItem -Path 'HKLM:\Software\MySoftwareKey' -Recurse -ErrorAction SilentlyContinue | Get-ItemProperty -Name Web -ErrorAction SilentlyContinue | Select-object -expandproperty Web

关键是隔离协议名称:之前的所有内容)和仅测试 表示存在大写字符;例如:

PS> ('Https:\Blah.blah.com' -split ':')[0] -cmatch '\p{Lu}'
True  # ditto for 'httpS:\...', 'hTtps:\...', 'HTTPS:\...', ...

PS> ('https:\Blah.blah.com' -split ':')[0] -cmatch '\p{Lu}'
False
  • (... -split ':')[0] 从 LHS 字符串中提取第一个基于 : 的标记,即协议名称。

  • -cmatch case-sensitively 匹配该协议名称中任何位置的正则表达式 \p{Lu}(大写字母)。

    • 注意:在这个简单的例子中,可以安全地假设只有 ASCII-range 字母 az 可以是协议的一部分名称,正则表达式 [A-Z] 就足够了;相比之下,\p{Lu} 匹配任何分类为字母的大写 Unicode 字符。

在您的命令上下文中:

Get-ChildItem -Path 'HKLM:\Software\MySoftwareKey' -Recurse -ErrorAction SilentlyContinue |
  Get-ItemProperty Web -ErrorAction SilentlyContinue | 
    Select-Object -ExpandProperty Web |
      Where-Object { ($_ -split ':')[0] -cmatch '\p{Lu}' }

请注意,虽然您应该能够使用Get-ItemPropertyValue Web(PSv5+)而不是环岛Get-ItemProperty Web | Select-Object -ExpandProperty Web,以便直接提取data 来自每个匹配的注册表值,由于 known bug.

,在撰写本文时,这 不是 一个选项