2017-09-13 66 views
0

我從來沒有-contains操作員在Powershell中工作我不知道爲什麼。包含操作員不在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

你」再loo ''匹配'Windows''或'-like'* Windows *'',包含的內容僅用於數組。 – ConnorLSW

+0

的'-match'運營商,據我瞭解,是正則表達式,其中包含通配符的較小的子集工作,這樣也能發揮作用。但是如果我想恰當地使用'contains'運算符,我該如何做?我的問題是不是我*如何做到這一點?*而是*爲什麼會發生這種從來沒有爲我工作,我在做什麼錯這個操作在這裏嗎?*有100辦法做的事。我可以從.NET基類庫中調用'「字符串值」.Contains()'。 –

+0

[PowerShell和的-contains運算符(https://stackoverflow.com/questions/18877580/powershell-and-the-contains-operator) –

回答

6

-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 

通常你會使用-like串操作者在PowerShell,該支持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如果沒有找到子串,所以任何非負的返回值可以被解釋爲找到了子字符串。

+0

阿的可能的複製!正如我懷疑的。你的第一行回答了我的問題。謝謝。我應該花點時間仔細閱讀文檔。 –

+0

@ WaterCoolerv2有很多的好東西在'about_ *'幫助主題,我更新了遏制經營者從'about_Comparison_Operators'文件 –

+0

這是正確的表格答案。我知道他們,@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'