C#通过进程调用curl命令,可以形成成功,但是curl输出C#应用无法获取解决,导致curl执行成功与否无法知道。

解决方法:

可以C#调用批处理,批处理再调用curl,curl加上参数–stderr,将输出定向到文件,在通过 type命令将输出文件显示,C#就可以获取curl输出结果。

C#代码:

private int ExeUpLoadFile(TextBox resulttxtbox)
 {
 int ret = 0;
 string workingFolder = System.IO.Directory.GetCurrentDirectory();
 string curlcmd = workingFolder + “\plugin\curl” + “upload.bat”;
 string cmdarg = this.UserNameTextBox.Text + " " + this.PasswordTextBox.Text + " " +
 this.DeviceIPTextBox.Text + " " + this.UpdateFileTextBox.Text;
 //创建进程对象
 Process tmpprocess = new Process();
 tmpprocess.StartInfo.FileName = curlcmd;//设定需要执行的命令
 tmpprocess.StartInfo.Arguments = cmdarg;
 tmpprocess.StartInfo.UseShellExecute = false;//不使用系统外壳程序启动
 tmpprocess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
 tmpprocess.StartInfo.RedirectStandardInput = true;//不重定向输入
 tmpprocess.StartInfo.RedirectStandardOutput = true; //不重定向输出
 tmpprocess.StartInfo.RedirectStandardError = false;
 tmpprocess.StartInfo.CreateNoWindow = true;//不创建窗口resulttxtbox.AppendText("  开始上传升级包...\r\n");//开始进程
 if (tmpprocess.Start())
 {
 string log = tmpprocess.StandardOutput.ReadLine();
 while (log != null)
 {
 if (resulttxtbox != null)
 {
 resulttxtbox.AppendText(log + “\r\n”);
 }if (log.IndexOf(“curl:”) > -1)
 {
 ret = -1;
 }
 log = tmpprocess.StandardOutput.ReadLine();
 }
 tmpprocess.Close();
 tmpprocess = null;
 }if (ret == 0)
 {
 resulttxtbox.AppendText(" 上传升级包完成.\r\n");
 }
 else
 {
 resulttxtbox.AppendText(" 上传升级包失败.\r\n");
 }return ret;
    }
    

对应批处理:
@echo off
 rem *************************************************
 rem
 rem 上传文件
 rem
 rem *************************************************
 rem 当前工作路径
 set workdir=%~dp0rem 获取网关登录用户
 set sgwuser=%1rem 获取网关登录密码
 set sgwpasswd=%2rem 获取网关地址
 set sgwaddr=%3rem 上传开发包
 %workdir%curl.exe -u %sgwuser%:%sgwpasswd% -T %4 ftp://%sgwaddr%/update.tar.gz --stderr %workdir%result.txt
 type %workdir%result.txt
 del /F/Q %workdir%result.txt