c # .net Ошибка зацикливания через перечислитель - PullRequest
3 голосов
/ 02 августа 2010

Я создал файл .bat, в котором отображается идентификатор SessionID и имя пользователя терминала сервера.Im Отображение информации в сетке данных

Вот вывод файла .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 и имя пользователя, которые работают несколькос кодом ниже.

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 Ответ

2 голосов
/ 02 августа 2010

Вы вызываете MoveNext дважды внутри цикла.Это вызывает проблему.

Когда вы находитесь в последней строке, вы вызываете MoveNext, он находит «rdpwd», затем он вызывает MoveNext один раз, затем он вызывает его снова, и это когда перечислительстановится недействительным.Затем последний MoveNext в то время как он ломается, потому что он уже в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...