我正在尝试创建一个 while 循环,其中其条件 block 将根据是否在另一个数组中找到精确的字符串匹配而得出 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
用于基于正则表达式的匹配(并且没有 anchor 会查找子字符串匹配)。条件逻辑是相反的:只要字符串不匹配,您就希望继续循环。
您的循环效率低下,因为它在每次迭代中都使用管道;对于内存中的数据,仅使用表达式会更快。
如果您确实想使用 PowerShell 循环解决此问题,我建议使用简单的 for
循环:
for ($i=0; $i -lt $Name.Count; ++$i) { if ($row -ceq $Name[$i]) { break } }
在这种情况下,如果未找到匹配项,$i
将包含 $Name.Count
的值。
关于arrays - PowerShell 中的 While 循环 boolean 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52509337/