Оператор PowerShell и -contains
Рассмотрим следующий фрагмент:
"12-18" -Contains "-"
Вы думаете, что это оценивается как true
, но это не так. Это будет оцениваться вместо false
. Я не уверен, почему это происходит, но это так.
Чтобы этого избежать, вы можете использовать это вместо:
"12-18".Contains("-")
Теперь выражение будет оцениваться как true.
Почему первый фрагмент кода ведет себя так? есть ли что-то особенное в -
, которое отлично не играет с -Contains
? В документации ничего не говорится об этом.
Ответы
Ответ 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 "-"
Ответ 4
-
like
лучше, или, по крайней мере, легче. -
match
используется для сравнения регулярных выражений.
Ссылка: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-6
Ответ 5
Ответ @Eris может содержать устаревшую информацию. Я не уверен.