【问题标题】:c#.net Error Looping throgh an Enumeratorc#.net 错误循环遍历枚举器
【发布时间】:2011-03-24 05:21:51
【问题描述】:

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

这是 .bat 文件的输出:

C:\Documents and Settings\adcock>qwinsta /server:ilsap01 SESSIONNAME 用户名 ID 状态 类型 设备 控制台 0 连接 wdcon rdp-tcp 65536 监听 rdpwd Jrodriguez 27 光盘 rdpwd pbahena 8 光盘 rdpwd tfurr 3 光盘 rdpwd rdp-tcp#2187 kchild 14 活动 rdpwd Trhodes 10 光盘 rdpwd ajordan 16 光盘 rdpwd Trhodes 11 光盘 rdpwd rdp-tcp#2191 rluna 15 活动 rdpwd rdp-tcp#2192 lcathy 17 活动 rdpwd

我想要显示的唯一信息是 SessionID 和用户名,它们与下面的代码有些配合。

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 循环完成但重新开始,并在添加了几个重复记录后引发错误。关于造成这种情况的任何想法。我认为它是我的正则表达式

【问题讨论】:

  • 每次检查 if(en.MoveNext())
  • 调试过程中为什么不打印出每个匹配项?你确定你可以在不检查是否还有匹配项的情况下移动这么多吗?
  • 我很想知道 .bat 文件代码是什么样的。也许另一种方法是使用 WMI 来获取终端服务 SessionID,而不是使用 .bat 文件和 System.Diagnostics.ProcessStartInfo。见:msdn.microsoft.com/en-us/library/aa383637(VS.85).aspx
  • .bat 代码“qwinsta /server:servername”
  • @igor if(en.MoveNext()) 解决了我的问题,谢谢!

标签: c# regex datagrid while-loop


【解决方案1】:

您在循环内调用了两次 MoveNext。这就是问题所在。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 2015-01-09
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2011-05-07
    相关资源
    最近更新 更多