包含不在 Powershell 中工作的运算符
Posted
技术标签:
【中文标题】包含不在 Powershell 中工作的运算符【英文标题】:Contains operator not working in Powershell 【发布时间】:2018-02-22 00:17:12 【问题描述】:我从来没有让-contains
运算符在 Powershell 中工作,我不知道为什么。
这是一个不起作用的示例。我使用-like
代替它,但如果你能告诉我为什么这不起作用,我会很高兴。
PS HKLM:\Software\Microsoft\Windows NT\CurrentVersion> (gp . P*).ProductName
Windows 10 Enterprise
PS HKLM:\Software\Microsoft\Windows NT\CurrentVersion> (gp . P*).ProductName -contains "Windows"
False
PS HKLM:\Software\Microsoft\Windows NT\CurrentVersion> (gp . P*).ProductName | gm | select TypeName | Get-Unique
TypeName
--------
System.String
【问题讨论】:
您正在寻找-match 'Windows'
或 -like '*Windows*'
,包含仅用于数组。
据我了解,-match
运算符用于处理正则表达式,其中包括较小的通配符子集,因此也可以使用。但是,如果我只想正确使用 contains
运算符,我该怎么做呢?我的问题不是我该怎么做?,而是为什么这对我不起作用,我在这里这个运算符做错了什么?有 100 种方法可以做这件事。我可以从 .NET 基类库中调用 "The string Value".Contains()
。
PowerShell and the -contains operator的可能重复
【参考方案1】:
-contains
运算符不是字符串运算符,而是 集合包含 运算符:
'a','b','c' -contains 'b' # correct use of -contains against collection
来自about_Comparison_Operators
help topic:
Type Operator Description
Containment -contains Returns true when reference value contained in a collection
-notcontains Returns true when reference value not contained in a collection
-in Returns true when test value contained in a collection
-notin Returns true when test value not contained in a collection
通常您会在 PowerShell 中使用 -like
字符串运算符,它支持 Windows 样式的通配符匹配(*
用于任意数量的任意字符,?
用于恰好一个任意字符,[abcdef]
用于其中之一一个字符集):
'abc' -like '*b*' # $true
'abc' -like 'a*' # $true
另一种选择是-match
运算符:
'abc' -match 'b' # $true
'abc' -match '^a' # $true
对于逐字匹配的子字符串,您可能需要转义任何输入模式,因为-match
是一个正则表达式运算符:
'abc.e' -match [regex]::Escape('c.e')
另一种方法是使用String.Contains()
方法:
'abc'.Contains('b') # $true
需要注意的是,与 powershell 字符串运算符不同,它区分大小写。
String.IndexOf()
是另一种选择,它允许您覆盖默认的区分大小写:
'ABC'.IndexOf('b', [System.StringComparison]::InvariantCultureIgnoreCase) -ge 0
IndexOf()
如果未找到子字符串则返回-1
,因此任何非负返回值都可以解释为已找到子字符串。
【讨论】:
啊!正如我所怀疑的那样。你的第一行回答了我的问题。谢谢你。我应该花点时间彻底阅读文档。 @WaterCoolerv2about_*
帮助主题中有很多好东西,我用about_Comparison_Operators
文档中的包含操作符表更新了答案
没错。我知道他们,@Mathias。只是还没有时间仔细阅读所有内容。【参考方案2】:
'-contains' 运算符最适合用于与列表或数组进行比较,例如
$list = @("server1","server2","server3")
if ($list -contains "server2")"True"
else "False"
输出:
True
我建议使用 '-match' 代替字符串比较:
$str = "windows"
if ($str -match "win") "`$str contains 'win'"
if ($str -match "^win") "`$str starts with 'win'"
if ($str -match "win$") "`$str ends with 'win'" else "`$str does not end with 'win'"
if ($str -match "ows$") "`$str ends with 'ows'"
输出:
$str contains 'win'
$str starts with 'win'
$str does not end with 'win'
$str ends with 'ows'
【讨论】:
以上是关于包含不在 Powershell 中工作的运算符的主要内容,如果未能解决你的问题,请参考以下文章