【问题标题】:While loop inside another while loop not re-reading inner while loopWhile循环在另一个while循环中,而不是重新读取内部while循环
【发布时间】:2025-12-29 19:05:11
【问题描述】:

我有 2 个 while 循环,一个在另一个循环中,它遍历 2 个不同的数据集,我希望外部 while 循环的第一行数据循环遍历内部 while 循环中的所有行以寻找匹配项,如果没有,则移动到外循环的第二行,再次循环内循环中的所有记录。但是,在第一个外循环的记录循环完内循环的所有记录后,外循环的第二行不再循环内循环的记录;就好像第一次尝试遍历内部循环中的所有记录并没有将自己重置回开始!这是我的代码 - 谁能告诉我哪里出错了?

$PgConnString = "select pgName from table1"
$MsConnString = "SELECT msName FROM table2";

$PgDbConn = CreateDbConnection "Postgres";
$PgDbCmd = CreateDbCommand $PgConnString $PgDbConn;

$PgReaderOutput = $PgDbCmd.ExecuteReader();

$MsDbConn = CreateDbConnection "MSSql";
$MsDbCmd = CreateDbCommand $MsConnString $MsDbConn;

$MsReaderOutput = $MsDbCmd.ExecuteReader();

while ($PgReaderOutput.Read())
{
    $ReporterName = $PgReaderOutput.GetValue(0);

    Write-Output "Current Reporter is: $ReporterName";

    while ($MsReaderOutput.Read())
    {
        $CurrMsRec = $MsReaderOutput.GetValue(0);
        Write-Output "Current SQL record is: $CurrMsRec";

        if($CurrMsRec -eq $ReporterName)
        {
            $Match = 1
            Write-Output "Matched"
        }
        else
        {
            Write-Output "No Matched"
            $Match = 0;
        }
    }

    If($Match -eq 1)
    {
        Write-Output "The reporter: $ReporterName has not been sent an email; send them one!";
    }
}

【问题讨论】:

标签: powershell while-loop


【解决方案1】:

在您的内部循环中,您将遍历 $MsReaderOutput.Read() 返回的所有元素。当这个内部循环第一次完成时,您不会在外部循环中更改任何关于 $MsReaderOutput 的内容,因此下次处理它时不可能有更多元素。

我假设您想在每个内部循环开始之前重置您的 $MsReaderOutput 对象,以便您可以再次开始对其进行迭代。

【讨论】:

  • 我确实想重置它。我该怎么做?
  • 你问你哪里出错了,我告诉你了。我对您在此处使用的 CreateDbConnection 和 CreateDbCommand 函数或返回的对象具有哪些方法一无所知。像很多人一样,一旦有人帮助你,你似乎就会变得完全被动。去看看你如何重置那个阅读器对象——你肯定有一些文档吗?
  • 谢谢。我想你可能已经知道如何重置它的答案了。我知道它没有被重置,但似乎是我的错,因为我在最后的陈述中没有更简洁地说明想知道如何重置它以及我可能会出错的地方。