【发布时间】: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