而 PowerShell 中的循环布尔条件



我正在尝试创建一个while循环,其中其条件块将根据在另一个数组中找到完全匹配的字符串匹配结果为true或false。如果找到完全匹配项,则应迭代到数组中的下一项,直到条件为 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 个字符串。

您可以使用[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的值。

最新更新