C# 无法向cmd.exe进程发送命令
我试图使用C# 无法向cmd.exe进程发送命令,c#,cmd,process,stdout,stdin,C#,Cmd,Process,Stdout,Stdin,我试图使用StandardInput.WriteLine(str)将命令发送到open cmd.exe进程,但似乎没有发送任何命令。首先,我用一个全局变量p(processp)打开一个进程 之后,我尝试使用一个简单的方法发送一个命令,将结果记录在一个文本框中 private void runcmd(string command) { p.StandardInput.WriteLine(command); var output = p.StandardOutput.ReadToEn
StandardInput.WriteLine(str)
将命令发送到open cmd.exe进程,但似乎没有发送任何命令。首先,我用一个全局变量p(processp
)打开一个进程
之后,我尝试使用一个简单的方法发送一个命令,将结果记录在一个文本框中
private void runcmd(string command)
{
p.StandardInput.WriteLine(command);
var output = p.StandardOutput.ReadToEnd();
TextBox1.Text = output;
}
现在我正在用
DIR
测试它,但是var-output
显示为null,这导致没有输出。是否有更好的方法将命令发送到open cmd.exe进程?如果不关闭stdin,我无法让它与stdout的同步读取一起工作,但它确实与stdout/stderr的异步读取一起工作。不需要传入/c
,只在通过参数传入命令时才这样做;但是,您并没有这样做,而是将命令直接发送到输入
var p = new Process()
{
StartInfo = {
CreateNoWindow = false,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
FileName = @"cmd.exe"}
};
p.OutputDataReceived += (sender, args1) => Console.WriteLine(args1.Data);
p.ErrorDataReceived += (sender, args1) => Console.WriteLine(args1.Data);
p.Start();
p.BeginOutputReadLine();
p.StandardInput.WriteLine("dir");
p.StandardInput.WriteLine("cd e:");
p.WaitForExit();
Console.WriteLine("Done");
您必须在
p.WaitForExit()
之前调用p.StandardOutput.ReadToEnd()
,否则可能会出现死锁。看见您没有提到死锁,但这可能是您的问题。尝试清除p.WaitForExit(),但问题仍然存在。Cmd/c
启动然后终止Cmd。仍然没有任何结果。此外,我还需要为多个命令保持进程打开状态,因此我无法关闭它。@FyreeW同步读取标准输出时,无论我做了什么尝试,我都只能通过关闭标准输入来使它工作。但是对于stdout的异步读取,一切似乎都很好。我用异步版本编辑了我的答案。我看到cmd shell弹出,但没有输出。@fyrew您必须去掉参数=“/C”
。如果你复制并粘贴我的代码,它将正常工作,然后你必须稍微向后工作,并使它做你想要的。我确保完全使用上面的代码(刚刚创建了一个新方法)。
var p = new Process()
{
StartInfo = {
CreateNoWindow = false,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
FileName = @"cmd.exe"}
};
p.OutputDataReceived += (sender, args1) => Console.WriteLine(args1.Data);
p.ErrorDataReceived += (sender, args1) => Console.WriteLine(args1.Data);
p.Start();
p.BeginOutputReadLine();
p.StandardInput.WriteLine("dir");
p.StandardInput.WriteLine("cd e:");
p.WaitForExit();
Console.WriteLine("Done");