【问题标题】:While loop boolean condition in PowerShellPowerShell中的while循环布尔条件
【发布时间】:2019-03-01 17:40:27
【问题描述】:

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

$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 个字符串。

【问题讨论】:

  • 问题是什么?

标签: arrays powershell object while-loop boolean


【解决方案1】:

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

  • 条件的逻辑是相反的:只要字符串 匹配,您就希望继续循环。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 2016-09-19
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2017-11-20
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多