Проверьте, содержится ли элемент массива в строке без использования регулярных выражений в PowerShell - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть эта строковая переменная:

$path = "C:\Windows"

У меня есть этот массив строк:

$badDir = "windows",
        "i3\ic",
        "program",
        "system",
        "pagefile.sys",
        "system",
        "swapfile.sys",
        "sourcecd", 
        "backup",
        "wwwroot",
        "users",
        "desktop",
        "documents"

Я пытаюсь оценить, содержит ли $path какие-либо из содержащихся строкв массиве $badDir в любом месте его значения.Например, поскольку мое значение $path равно C:\Windows, а один из элементов моего массива - windows, «Windows» должно соответствовать, и следующая оценка должна возвращать true.

$badDir -Match $path.ToLower()

Однако возвращается false.Что я здесь делаю неправильно?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Что я здесь делаю неправильно?

Вы проверяете не то, что нужно, и проверяете неверно.

Поскольку значение $ path равно "C: \ Windows", а $ badDir не содержит "c: \ windows 'и не содержит (строка, содержащая "c: \ windows"), оценка должна возвращать false

Если вы не хотите использовать регулярное выражение, вам нужно перебрать $ badDir ипротестируйте каждый элемент, а затем посмотрите на результаты:

$path = "C:\Windows"

$badDir = "windows",
    "i3\ic",
    "program",
    "system",
    "pagefile.sys",
    "system",
    "swapfile.sys",
    "sourcecd", 
    "backup",
    "wwwroot",
    "users",
    "desktop",
    "documents"

$badDirmatch = $badDir.Where({$path.ToLower().contains($_)}, 'First').Count -as [bool]

.Where() быстрее, чем | Where-Object, и «первое» отсечение позволит ему немедленно остановиться на матче, а не тестировать все остальныеэлементов.

0 голосов
/ 18 сентября 2018

$badDir -Match $path.ToLower() будет сравнивать "C: \ Windows" с каждым элементом $baddir.Так как ни одно из этих совпадений не является совпадением, вот почему вы ошибаетесь.Операция запутана также, так как ваша строка шаблона содержит регулярное выражение.Однако в любом случае это не то, что вам нужно ...

Вы уверены, что вам нужно сравнить каждый элемент $baddir s в отдельности с $path.Я не знаю ни одного оператора, который будет выполнять ленивое сопоставление, как вы ожидаете, здесь

($badDir | ForEach-Object{$path -match [regex]::Escape($_)}) -contains $true

$badDir элементы содержат метасимволы регулярных выражений, поэтому нам нужно избегать их, чтобы получить истинные совпадения.Затем мы просто проверяем, содержит ли полученный логический массив истинные элементы.Вставьте это в блок if или в трубу, и вы сможете получить желаемые результаты.

Существует другой способ работы с этим, в зависимости от вашей фактической реализации, но приведенного выше должно быть достаточно.

Без регулярных выражений

В заголовке говорится без регулярных выражений, поэтому давайте адаптируем то, что мы имеем выше, чтобы удалить эту часть подхода.Логика все та же

($badDir | ForEach-Object{$path.ToLower().IndexOf("$_".ToLower()) -ge 0}) -contains $true

Проверьте, находится ли одна строка в другой.Если есть, мы оцениваем как логическое значение и, как и прежде, проверяем, верен ли один из результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...