Хотя логическое условие цикла в PowerShell - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь создать цикл while, в котором его блок условий будет иметь значение true или false в зависимости от того, найдено ли точное совпадение строки в другом массиве.Если точное совпадение найдено, он должен выполнять итерацию до следующего элемента в массиве до тех пор, пока условие не станет ложным.строки в массиве $ Name до 9-й строки.

1 Ответ

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

Вы можете использовать [Array]::IndexOf() вместо цикла:

$Name = "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"
$row = "j"
$i = [Array]::IndexOf($Name, $row)  # -> $i equals 9

$i будет содержать -1, если совпадение не найдено.


Что за что?Вы пытались:

  • Для точного сопоставления строк используйте -ceq (регистрозависимая форма оператора -eq), а не -match, потому что -match предназначен для регулярное выражение сопоставление на основе (и без привязок находит подстрока совпадений).

  • Логика вашего условия обратная: вы хотите продолжать циклпока строка не соответствует.

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

Если вы хотите решить эту проблему с помощью цикла PowerShell, я предлагаю простой for цикл:

for ($i=0; $i -lt $Name.Count; ++$i) { if ($row -ceq $Name[$i]) { break } }

В этом случае $i будет содержать значение $Name.Count, если совпадений не найдено.

...