c#.net错误通过枚举器循环

时间:2010-08-02 13:24:22

标签: c# regex datagrid while-loop

我创建了一个.bat文件,显示服务器终端Service SessionID和Username。 我在数据网格中显示信息

这是.bat文件的输出:

C:\Documents and Settings\adcock>qwinsta /server:ilsap01
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 console                                     0  Conn    wdcon
 rdp-tcp                                 65536  Listen  rdpwd
                   Jrodriguez               27  Disc    rdpwd
                   pbahena                   8  Disc    rdpwd
                   tfurr                     3  Disc    rdpwd
 rdp-tcp#2187      kchild                   14  Active  rdpwd
                   Trhodes                  10  Disc    rdpwd
                   ajordan                  16  Disc    rdpwd
                   Trhodes                  11  Disc    rdpwd
 rdp-tcp#2191      rluna                    15  Active  rdpwd
 rdp-tcp#2192      lcathey                  17  Active  rdpwd

我想要显示的唯一信息是SessionID和Username,它与下面的代码有些作用。

protected void Button1_Click(object sender, EventArgs e)
{
    System.Diagnostics.ProcessStartInfo psi = new      System.Diagnostics.ProcessStartInfo(@"C:\listfiles.bat");
    psi.RedirectStandardOutput = true;
    psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    psi.UseShellExecute = false;
    System.Diagnostics.Process listFiles;
    listFiles = System.Diagnostics.Process.Start(psi);
    System.IO.StreamReader rawUserData = listFiles.StandardOutput;
    listFiles.WaitForExit(30000);
    try
    {

        DataTable table2 = new DataTable();
        table2.Columns.Add(new DataColumn("UserName", typeof(string)));
        table2.Columns.Add(new DataColumn("SessionId", typeof(string)));

        String myString = rawUserData.ReadToEnd();
        string exp = @"([\w_]+)"; ;


        MatchCollection matches = Regex.Matches(myString, exp,RegexOptions.IgnoreCase);

        IEnumerator en = matches.GetEnumerator();

        while (en.MoveNext())
        {
            Match match = (Match)en.Current;

            if (en.Current.ToString() == "rdpwd")
            {
                en.MoveNext();

                Match match_Item = (Match)en.Current;

                string item = match_Item.Value;

                en.MoveNext();

                Match match_Item2 = (Match)en.Current;

                string item2 = match_Item2.Value;

                DataRow row = table2.NewRow();
                row[0] = item.Split()[0];
                row[1] = item2.Split()[0];
                //row[1] = item.Split(',')[1];
                table2.Rows.Add(row);

                //en.MoveNext();
                //break;

            }


        }

        this.displayUsers.DataSource = table2;
        this.displayUsers.DataBind();
    }

    catch (Exception ex)
    {
        Response.Write(ex);
    }

我得到的错误是: 枚举尚未开始或已经完成。

我设置了一个断点,它接缝表示while循环完成但重新开始,在它添加一些重复记录之后,它会抛出错误。关于什么的任何想法都会导致这种情况。我认为它是我的RegEx

1 个答案:

答案 0 :(得分:2)

你在循环中调用两次MoveNext。这导致了问题。

当你在最后一行时,你调用MoveNext,它找到“rdpwd”,然后它调用MoveNext一次,然后再调用它,这就是枚举器变为无效的时候。 然后在最后一次MoveNext中断,因为它已经在最后了。