PowerShell中的While循环布尔条件

时间:2018-09-26 03:04:35

标签: arrays powershell object while-loop boolean

我正在尝试创建一个while循环,根据是否在另一个数组中找到了完全匹配的字符串,其条件块将为true或false。如果找到完全匹配,则应迭代到数组中的下一项,直到条件为假。

$Name = "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"
$row = "j"
$i = 0

While($row | Where-Object {$_ -match $Name[$i]}){$i++}

所需的输出为$ i = 9,因为它必须将$ Name数组中的所有字符串迭代到第9个字符串。

1 个答案:

答案 0 :(得分:2)

您可以使用[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用于<基于em> regex 的匹配(并且没有锚会找到 substring 匹配项)。

  • 条件逻辑相反:只要字符串不匹配,您就希望保持循环。

  • 您的循环效率低下,因为它在每次迭代中都使用管道。对于内存数据,仅使用表达式会更快。

如果您确实想通过PowerShell循环解决此问题,建议您使用一个简单的for循环:

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

在这种情况下,如果找不到匹配项,$i将包含$Name.Count的值。