我从未让-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
答案 0 :(得分:8)
/etc/ld.so.conf.d/libgdal-x86_64.conf
运算符不是字符串运算符,而是集合包含运算符:
-contains
来自about_Comparison_Operators
help topic:
'a','b','c' -contains 'b' # correct use of -contains against collection
通常你会在PowerShell中使用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
字符串运算符,它支持Windows样式的通配符匹配(-like
表示任意数量的任意字符,*
表示任何一个字符, ?
用于其中一个字符集):
[abcdef]
另一种选择是'abc' -like '*b*' # $true
'abc' -like 'a*' # $true
运算符:
-match
对于逐字子字符串匹配,您可能希望转义任何输入模式,因为'abc' -match 'b' # $true
'abc' -match '^a' # $true
是一个正则表达式运算符:
-match
另一种方法是使用String.Contains()
方法:
'abc.e' -match [regex]::Escape('c.e')
需要注意的是,与powershell字符串运算符不同,它区分大小写。
String.IndexOf()
是另一种选择,这个允许你覆盖默认的区分大小写:
'abc'.Contains('b') # $true
如果找不到子字符串, 'ABC'.IndexOf('b', [System.StringComparison]::InvariantCultureIgnoreCase) -ge 0
将返回IndexOf()
,因此任何非负返回值都可以解释为找到了子字符串。
答案 1 :(得分: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'