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

本文关键字:批处理文件 执行 代码 使用 | 更新日期: 2023-09-27 18:26:19

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

  1. 内部批处理文件
  2. 外部批处理文件

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

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服务中使用相同的代码时,进程不会退出。

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

您应该为此使用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);