使用C#代码执行批处理文件

时间:2014-10-13 13:55:54

标签: c# shell windows-services sftp

我有两个批处理文件来执行SFTP命令。

  1. 内部批处理文件
  2. 外部批处理文件
  3. 内部批处理文件包含以下代码:

    put D:\Source_Data\SFTP\Sample.xml
    

    外部批处理文件包含以下代码:

    psftp -b D:\Source_Data\SFTP\Innerbatch.bat -l username -i D:\WebCash\privatekey.ppk @server.domain.com
    

    外部批处理文件内部调用内部批处理文件。如何使用C#代码执行批处理文件?

    此外,我需要获取错误代码(即)批处理文件是否在C#代码中成功执行。

    我使用以下代码执行批处理文件。

    Process p = null;
    p = Process.Start(@"C:\Batch\file.bat");
    p.WaitForExit(1000);
    p.ExitCode;
    

    但是收到错误。执行流程时无法确定所需信息。

    问题是Windows服务。我可以通过普通的Windows窗体应用程序运行批处理文件。但是,当我在Windows服务中使用相同的代码时,该过程不会退出。

1 个答案:

答案 0 :(得分:2)

您应该使用System.Diagnostics.Process

根据您的评论,批处理文件最多可能需要2分钟才能执行。我将实现以下代码:

public static int ExecuteBatchFile(string batchFilePath, int timeout, bool killOnTimeout = false)
{
   using (var p = Process.Start(batchFilePath))
   {
       p.WaitForExit(timeout);

       if (p.HasExited)
           return p.ExitCode;

       if (killOnTimeout)
       {
           p.Kill();
       }
       else
       {
           p.CloseMainWindow();
       }

       throw new TimeoutException(string.Format("Time allotted for executing `{0}` has expired ({1} ms).", batchFilePath, timeout));
   }
}

UPDATE 如果您正在从Windows服务执行批处理文件,那么通常您必须禁用用户界面。您可以按照以下模式执行此操作:

ProcessStartInfo info = new ProcessStartInfo(exePath); //exePath must be full path.
info.CreateNoWindow = true;
info.UseShellExecute = false;
Process.Start(info);