我有两个批处理文件来执行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服务中使用相同的代码时,该过程不会退出。
答案 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);