使用C#代码执行批处理文件
本文关键字:批处理文件 执行 代码 使用 | 更新日期: 2023-09-27 18:26:19
我有两个批处理文件来执行SFTP命令。
- 内部批处理文件
- 外部批处理文件
内部批处理文件包含以下代码:
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服务中使用相同的代码时,进程不会退出。
您应该为此使用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);