C# 用C语言发送cmd命令并读取结果#

C# 用C语言发送cmd命令并读取结果#,c#,process,cmd,command-line-arguments,command-prompt,C#,Process,Cmd,Command Line Arguments,Command Prompt,我想发送带有参数的命令,并从cmd读取它们的答案。所以,我写了下面的代码,但它不工作,并且在屏幕上锁定(myString通常为null-“”)。我只想向打开的命令提示符发送命令。问题在哪里?提前谢谢。(例如:如何获取ping请求的结果?) cmd/c日期被阻塞。你可以使用 p.StartInfo.Arguments = "/c date /T"; 停止等待输入的日期,或向cmd p.StartInfo.RedirectStandardInput = true; ... p.StandardIn

我想发送带有参数的命令,并从cmd读取它们的答案。所以,我写了下面的代码,但它不工作,并且在屏幕上锁定(myString通常为null-“”)。我只想向打开的命令提示符发送命令。问题在哪里?提前谢谢。(例如:如何获取ping请求的结果?)


cmd/c日期
被阻塞。你可以使用

p.StartInfo.Arguments = "/c date /T";
停止等待输入的日期,或向
cmd

p.StartInfo.RedirectStandardInput = true;
...
p.StandardInput.Write("\n");
..或读取异步,以便在cmd等待输入时获得输出:

p.BeginOutputReadLine();
p.OutputDataReceived += (_, e) => Console.WriteLine(e.Data);

此代码可能会帮助您

    string strOutput;
    //Starting Information for process like its path, use system shell i.e. control process by system etc.
    ProcessStartInfo psi = new ProcessStartInfo(@"C:\WINDOWS\system32\cmd.exe");
    // its states that system shell will not be used to control the process instead program will handle the process
    psi.UseShellExecute = false;
    psi.ErrorDialog = false;
    // Do not show command prompt window separately
    psi.CreateNoWindow = true;
    psi.WindowStyle = ProcessWindowStyle.Hidden;
    //redirect all standard inout to program
    psi.RedirectStandardError = true;
    psi.RedirectStandardInput = true;
    psi.RedirectStandardOutput = true;
    //create the process with above infor and start it
    Process plinkProcess = new Process();
    plinkProcess.StartInfo = psi;
    plinkProcess.Start();
    //link the streams to standard inout of process
    StreamWriter inputWriter = plinkProcess.StandardInput;
    StreamReader outputReader = plinkProcess.StandardOutput;
    StreamReader errorReader = plinkProcess.StandardError;
    //send command to cmd prompt and wait for command to execute with thread sleep
    inputWriter.WriteLine("C:\\PLINK -ssh root@susehost -pw opensuselinux echo $SHELL\r\n");
    Thread.Sleep(2000);
    // flush the input stream before sending exit command to end process for any unwanted characters
    inputWriter.Flush();
    inputWriter.WriteLine("exit\r\n");
    // read till end the stream into string
    strOutput = outputReader.ReadToEnd();
    //remove the part of string which is not needed
    int val = strOutput.IndexOf("-type\r\n");
    strOutput = strOutput.Substring(val + 7);
    val = strOutput.IndexOf("\r\n");
    strOutput = strOutput.Substring(0, val);
    MessageBox.Show(strOutput);

可能会有帮助。已尝试此代码并按预期工作。但是,如果没有/T标志,命令shell将提示您插入新日期。
    string strOutput;
    //Starting Information for process like its path, use system shell i.e. control process by system etc.
    ProcessStartInfo psi = new ProcessStartInfo(@"C:\WINDOWS\system32\cmd.exe");
    // its states that system shell will not be used to control the process instead program will handle the process
    psi.UseShellExecute = false;
    psi.ErrorDialog = false;
    // Do not show command prompt window separately
    psi.CreateNoWindow = true;
    psi.WindowStyle = ProcessWindowStyle.Hidden;
    //redirect all standard inout to program
    psi.RedirectStandardError = true;
    psi.RedirectStandardInput = true;
    psi.RedirectStandardOutput = true;
    //create the process with above infor and start it
    Process plinkProcess = new Process();
    plinkProcess.StartInfo = psi;
    plinkProcess.Start();
    //link the streams to standard inout of process
    StreamWriter inputWriter = plinkProcess.StandardInput;
    StreamReader outputReader = plinkProcess.StandardOutput;
    StreamReader errorReader = plinkProcess.StandardError;
    //send command to cmd prompt and wait for command to execute with thread sleep
    inputWriter.WriteLine("C:\\PLINK -ssh root@susehost -pw opensuselinux echo $SHELL\r\n");
    Thread.Sleep(2000);
    // flush the input stream before sending exit command to end process for any unwanted characters
    inputWriter.Flush();
    inputWriter.WriteLine("exit\r\n");
    // read till end the stream into string
    strOutput = outputReader.ReadToEnd();
    //remove the part of string which is not needed
    int val = strOutput.IndexOf("-type\r\n");
    strOutput = strOutput.Substring(val + 7);
    val = strOutput.IndexOf("\r\n");
    strOutput = strOutput.Substring(0, val);
    MessageBox.Show(strOutput);