使用 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 字母
a
到 z
可以是协议的一部分名称,正则表达式 [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.
,在撰写本文时,这 不是 一个选项
我正在使用 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 字母
a
到z
可以是协议的一部分名称,正则表达式[A-Z]
就足够了;相比之下,\p{Lu}
匹配任何分类为字母的大写 Unicode 字符。
- 注意:在这个简单的例子中,可以安全地假设只有 ASCII-range 字母
在您的命令上下文中:
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.