包含不在Powershell中运行的运算符

时间:2017-09-13 10:20:55

标签: powershell

我从未让-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

2 个答案:

答案 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'