在c#'中运行命令行的ProcessStartInfo

时间:2018-01-27 12:02:46

标签: c#

我正在从c#

运行以下内容

vpncmd位于c:\ windows \ system32

当我在命令提示符

中运行时,运行vpncmd命令字符串可以正常工作

如果我用" ipconfig / all"等库存命令替换vpncmd它工作正常

我有另一个系统运行完全相同的命令,工作正常(唯一的区别是这台服务器是Windows Server 2016,其工作的是Server 2012)

结果总是以""

返回
 ExecuteCommandBuild("vpncmd <server> /server /hub:<hub> /PASSWORD:<psswd> /cmd iptable");

 public void ExecuteCommandBuild(object command)
        {

            try
            {

                System.Diagnostics.ProcessStartInfo procStartInfo =
                new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command); 
                procStartInfo.RedirectStandardOutput = true;
                procStartInfo.UseShellExecute = false;               
                procStartInfo.CreateNoWindow = true;              
                System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.StartInfo = procStartInfo;
                proc.Start();              
                string result = proc.StandardOutput.ReadToEnd();


}

2 个答案:

答案 0 :(得分:2)

原因是您实际上是在流程中创建了一个新流程(cmd)。

相反,您需要直接调用该过程:

ExecuteCommandBuild("vpncmd", "<server> /server /hub:<hub> /PASSWORD:<psswd> /cmd iptable");


public void ExecuteCommandBuild(string fileName, string arguments)
        {

            try
            {

                System.Diagnostics.ProcessStartInfo procStartInfo =
                new System.Diagnostics.ProcessStartInfo(fileName, arguments); 
                procStartInfo.RedirectStandardOutput = true;
                procStartInfo.UseShellExecute = false;               
                procStartInfo.CreateNoWindow = true;              
                System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.StartInfo = procStartInfo;
                proc.Start();              
                string result = proc.StandardOutput.ReadToEnd();


}

此外,如果数据太大,ReadToEnd可能会产生问题。如果您的数据很大,我可以根据需要提供备用异步代码。

答案 1 :(得分:0)

感谢我的实际问题是vpncmd需要在C:\ Windows \ SysWOW64中 虽然它在c:\ windows \ system32中,但即使在cmd中使用绝对路径也找不到它。你的回答帮助我解决了我的问题