Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法向cmd.exe进程发送命令_C#_Cmd_Process_Stdout_Stdin - Fatal编程技术网

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");