将参数传递给cmd.exe

时间:2011-02-18 22:16:29

标签: c# .net

我正在尝试从我的C#程序ping本地计算机。为此,我使用以下代码。

System.Diagnostics.ProcessStartInfo proc = new System.Diagnostics.ProcessStartInfo();
proc.FileName = @"C:\windows\system32\cmd.exe";
proc.Arguments = @"""ping 10.2.2.125""";
System.Diagnostics.Process.Start(proc);

这将打开一个命令行窗口,但不会调用ping。是什么原因?

6 个答案:

答案 0 :(得分:35)

你需要包含“/ c”参数来告诉cmd.exe你的意思:

proc.Arguments = "/c ping 10.2.2.125";

(你可以直接调用ping.exe。有时这是合适的,以及更容易调用cmd的时间。)

答案 1 :(得分:7)

您可以使用System.Net.NetworkInformation.Ping class

    public static int GetPing(string ip, int timeout)
    {
        int p = -1;
        using (Ping ping = new Ping())
        {
                PingReply reply = ping.Send(_ip, timeout);
                if (reply != null)
                    if (reply.Status == IPStatus.Success)
                        p = Convert.ToInt32(reply.RoundtripTime);
        }
        return p;
    }

答案 2 :(得分:7)

public void ExecuteCommand(String command)
{
   Process p = new Process();
   ProcessStartInfo startInfo = new ProcessStartInfo();
   startInfo.FileName = "cmd.exe";
   startInfo.Arguments = command;
   p.StartInfo = startInfo;
   p.Start();
}

用法: ExecuteCommand(@"/c ping google.com -t");

不要忘记使用/c

答案 3 :(得分:6)

cmd /C 

cmd /K

可能/ C因为/ K没有立即终止

答案 4 :(得分:2)

要直接调用ping命令,请按照您的问题进行操作,但将cmd.exe替换为ping.exe

ProcessStartInfo proc = new ProcessStartInfo();
proc.FileName = @"C:\windows\system32\ping.exe";
proc.Arguments = @"10.2.2.125";
Process.Start(proc);

答案 5 :(得分:0)

如果您正在寻找使用外部命令行可执行文件的更高级方法,您可以尝试CliWrap。例如,您可以使用它轻松实时流式传输 ping 结果,因为它们是由底层进程写入控制台的:

var cmd = Cli.Wrap("ping").WithArguments("stackoverflow.com");
await foreach (var evt in cmd.ListenAsync())
{
     if (evt is StandardOutputCommandEvent stdOut)
     {
         Console.WriteLine(stdOut.Text);
     }
}