C# 任务列表命令赢得';当RedirectStandardOutput为true时,t退出
我正在尝试执行命令并等待它退出:C# 任务列表命令赢得';当RedirectStandardOutput为true时,t退出,c#,windows,cmd,process,C#,Windows,Cmd,Process,我正在尝试执行命令并等待它退出: Process proc = new Process(); proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.Arguments = "/c tas
Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = "/c tasklist";
proc.Start();
proc.WaitForExit();
return;
但是,如果RedirectStandardOutput
设置为true,则不会退出tasklist
命令
如果我将RedirectStandardOutput
设置为false或将命令更改为/c whoami
,它几乎会立即退出
有什么想法吗?在调用
WaitForExit()
之前,您应该先阅读输出,此示例工作正常:
processproc=newprocess();
proc.StartInfo.UseShellExecute=false;
proc.StartInfo.RedirectStandardOutput=true;
proc.StartInfo.RedirectStandardError=true;
proc.StartInfo.FileName=“cmd.exe”;
proc.StartInfo.Arguments=“/c tasklist”;
proc.Start();
var output=proc.StandardOutput.ReadToEnd();
进程WaitForExit();
控制台写入线(输出);
返回;
在不读取输出的情况下,tasklist
进程会等待父进程读取输出,如的备注部分所示
如果父进程调用
p.WaitForExit
beforep.StandardOutput.ReadToEnd
和子进程
写入足够的文本以填充重定向的流。父进程
将无限期地等待子进程退出。孩子
进程将无限期地等待父进程读取完整数据
标准输出
流
您还可以异步读取进程输出(并限制进程等待退出超时),如下所示
processproc=newprocess();
StringBuilder输出=新的StringBuilder();
proc.StartInfo.UseShellExecute=false;
proc.StartInfo.RedirectStandardOutput=true;
proc.StartInfo.RedirectStandardError=true;
proc.StartInfo.FileName=“cmd.exe”;
proc.StartInfo.Arguments=“/c tasklist”;
proc.OutputDataReceived+=(s,e)=>
{
output.Append(e.Data).Append(“\n”);
};
proc.ErrorDataReceived+=(s,e)=>
{
output.Append(e.Data).Append(“\n”);
};
proc.Start();
进程BeginOutputReadLine();
WaitForExit程序(100);
控制台写入线(输出);
返回;
此外,如果要重定向两个流(错误和输出),则至少异步读取了其中一个流,因为再次出现死锁(MSDN链接显示了一个示例)Insert
console.WriteLine(proc.StandardOutput.ReadToEnd())代码>介于proc.Start()之间代码>和proc.WaitForExit()代码>@JosefZ添加ReadToEnd()成功。但是我还需要限制使用proc.standardpoutput.read()
读取的最大字节数。如果我在WaitForExit()
之前调用Read()
,我将得到部分输出;如果我先执行WaitForExit()
,它将被卡住