PowerShell ve -contain operatörü


143

Aşağıdaki snippet'i düşünün:

"12-18" -Contains "-"

Bunun değerlendirildiğini düşünürdünüz true, ama değil. Bu falseonun yerine değerlendirir . Bunun neden olduğundan emin değilim, ama oluyor.

Bundan kaçınmak için bunun yerine şunu kullanabilirsiniz:

"12-18".Contains("-")

Şimdi ifade doğru olarak değerlendirilecektir.

İlk kod snippet'i neden böyle davranıyor? bu konuda -hoş olmayan özel bir şey var -Containsmı? Dokümantasyon bu konuda bir şey söz etmez.

Yanıtlar:


197

-ContainsOperatör karşılaştırmalar alt dize yapmaz ve maç tam bir dize olmalıdır ve koleksiyonları aramak için kullanılır.

Bağlantı kurduğunuz belgelerden:

-Açıklama: Muhafaza operatörü. Bir referans değerleri koleksiyonunun tek bir test değeri içerip içermediğini söyler.

Sağladığınız örnekte, yalnızca bir dize öğesi içeren bir koleksiyonla çalışıyorsunuz.

Bağlandığınız belgeleri okursanız, bu davranışı gösteren bir örnek görürsünüz:

Örnekler:

PS C:\> "abc", "def" -Contains "def"
True

PS C:\> "Windows", "PowerShell" -Contains "Shell"
False  #Not an exact match

Bence istediğiniz şey -Matchoperatör:

"12-18" -Match "-"

Hangi döner True.

Önemli: Yorumlarda ve bağlantılı belgelerde belirtildiği gibi, -Matchoperatörün metin eşleştirmesi yapmak için düzenli ifadeler kullandığına dikkat edilmelidir .


14
Tamlık için -Match iyi bir eşleme olsa da normal ifade kullanır. Kesin olmayan bir dize içeren bir kontrol istiyorsanız, OP açıklandığı gibi yapmalısınız:"12-18".Contains("-")
8DH

4
@ 8DH - çok iyi yakala :). Soruyu yeniden okuduktan sonra Containspowershell operatörü ve .Contains() .NET String yöntemi arasındaki farkı netleştirmem gerektiğini düşünüyorum .
Kev

1
Yukarıda yorumda daha önce belirtildiği gibi, -Matchnormal ifade kullanır. Bu, string parametresinin normal bir dize değil normal ifade olduğu anlamına gelir. Örneğin, "hello" -Match "."true değerini döndürür, çünkü "."bir regex burada '.' herhangi bir karakterle eşleşecektir. Bir dizenin durağı içerip içermediğini kontrol etmek için: "hello" -Match "\."(yanlış döndürür)
malla

1
@malla - iyi bir nokta, bununla ilgili bir notta düzenledim. Teşekkürler.
Kev

Bu kesinlikle "sahte bir arkadaş"! :) "-içerir" varlığı "bir listeye ait" anlamına gelir.
Raúl Salinas-Monteagudo

38

-Containsaslında bir toplama operatörüdür. Koleksiyonun nesneyi içermesi doğrudur. Dizelerle sınırlı değildir.

-matchve-imatch normal ifade dizesi eşleştiricileridir ve yakalamalarla kullanılacak otomatik değişkenleri ayarlar.

-like, -ilikeSQL benzeri eşleştiricilerdir.


13

Şunları kullanabilirsiniz like:

"12-18" -like "*-*"

Ya splitiçin contains:

"12-18" -split "" -contains "-"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.