Подтвердить что ты не робот

Оператор PowerShell и -contains

Рассмотрим следующий фрагмент:

"12-18" -Contains "-"

Вы думаете, что это оценивается как true, но это не так. Это будет оцениваться вместо false. Я не уверен, почему это происходит, но это так.

Чтобы этого избежать, вы можете использовать это вместо:

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

Теперь выражение будет оцениваться как true.

Почему первый фрагмент кода ведет себя так? есть ли что-то особенное в -, которое отлично не играет с -Contains? В документации ничего не говорится об этом.

4b9b3361

Ответ 1

Оператор -Contains не выполняет сравнения подстрок, и совпадение должно быть в полной строке и используется для поиска в коллекциях.

Из документации, на которую вы ссылаетесь:

-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 использует регулярные выражения для сопоставления текста.

Ответ 2

-Contains на самом деле оператор сбора. Это правда, если коллекция содержит объект. Это не ограничено последовательностями.

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

-like, -ilike являются сопоставителями SQL -like.

Ответ 3

Вы можете использовать like:

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

Или split для contains:

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

Ответ 5

Ответ @Eris может содержать устаревшую информацию. Я не уверен.