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


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

"12-18" -Contains "-"

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

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

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

теперь выражение будет иметь значение true.

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

3 78

3 ответа:

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.

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

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

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

можно использовать like:

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

или split на contains:

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