PowerShell та оператор -контейнер


143

Розглянемо наступний фрагмент:

"12-18" -Contains "-"

Ви можете подумати, що це оцінюється true, але це не так. Це falseзамість цього буде оцінено . Я не впевнений, чому це відбувається, але це так.

Щоб цього уникнути, ви можете скористатися цим:

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

Тепер вираз буде оцінено як істинне.

Чому перший фрагмент коду поводиться так? чи є щось особливе в -тому, що не грає добре -Contains? У документації нічого про це не згадується.

Відповіді:


196

The -ContainsОператор робить подстроки порівняння і матч повинен бути на повну рядок і використовується для пошуку колекцій.

З документації, до якої ви посилаєтесь:

-Опис містить: Оператор розваг. Показує, чи містить колекція опорних значень одне тестове значення.

У прикладі, який ви надали, ви працюєте з колекцією, що містить лише один елемент рядка.

Якщо ви прочитаєте пов'язану з вами документацію, ви побачите приклад, який демонструє таку поведінку:

Приклади:

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

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

Я думаю, що ти хочеш - це -Matchоператор:

"12-18" -Match "-"

Який повертається True.

Важливо: Як зазначено в коментарях та зв'язаній документації , слід зазначити, що -Matchоператор використовує регулярні вирази для виконання відповідності тексту.


14
Для повноти, хоча -Match може бути хорошим збігом, він використовує регулярний вираз. Якщо ви хочете, щоб однозначна рядок містить перевірку, слід зробити так, як описує ОП:"12-18".Contains("-")
8DH

4
@ 8DH - дуже хороший улов :). Перечитавши питання, я думаю, мені потрібно з’ясувати різницю між Containsоператором powerhell та методом .Contains() .NET String .
Кев

1
Як вже було сказано в коментарі вище, -Matchвикористовується регулярний вираз. Це означає, що параметр рядка - це регулярний вираз, а не звичайний рядок. Наприклад, "hello" -Match "."повернеться true, тому що "."це регулярне вираження, де a '. відповідатиме будь-якому персонажу. Щоб перевірити, чи містить рядок повну зупинку: "hello" -Match "\."(повертає помилку)
malla

1
@malla - хороший момент, я відредагував у примітці про це. Дякую.
Кев

Це звичайно "фальшивий друг"! :) Наявність "-міст" означає "належність до списку".
Рауль Салінас-Монтеагудо

38

-Containsнасправді оператор збору. Це правда, якщо колекція містить об'єкт. Це не обмежується рядками.

-matchі-imatch є відповідними рядками регулярних виразів, і встановлюють автоматичні змінні для використання із захопленнями.

-like, -ilikeє відповідні SQL.


13

Ви можете використовувати like:

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

Або splitдля contains:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.