我有一个服务有时会调用批处理文件.批处理文件需要5-10秒才能执行:
System.Diagnostics.Process proc = new System.Diagnostics.Process(); // Declare New Process proc.StartInfo.FileName = fileName; proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; proc.StartInfo.CreateNoWindow = true; proc.Start(); proc.WaitForExit();
当我在控制台中运行相同的代码时,该文件确实存在并且代码可以正常工作.然而,当它在服务内部运行时,它会挂起WaitForExit()
.我必须从Process中删除批处理文件才能继续.(我确定该文件存在,因为我可以在进程列表中看到它.)
我该如何修复这个挂断?
更新#1:凯文的代码允许我获得输出.我的一个批处理文件仍然挂起.
"C:\ EnterpriseDB\Postgres\8.3\bin\pg_dump.exe"-i -h localhost -p 5432 -U postgres -F p -a -D -v -f"c:\ backupcasecocher\backupdateevent2008.sql"-t "\"public \".\"dateevent \"""DbTest"
另一个批处理文件是:
"C:\ EnterpriseDB\Postgres\8.3\bin\vacuumdb.exe"-U postgres -d DbTest
我检查了路径,postgresql
路径很好.输出目录确实存在,仍然可以在服务外部运行.有任何想法吗?
而不是批处理文件的路径,我写了"C:\ EnterpriseDB\Postgres\8.3\bin\pg_dump.exe"并为其proc.StartInfo.FileName
添加了所有参数proc.StartInfo.Arguments
.结果没有变化,但我pg_dump.exe
在进程窗口中看到了.同样,这只发生在服务中.
我已经与管理员组中的用户一起运行该服务,但无济于事.我恢复null
了服务的用户名和密码
我创建了一个简单的服务来在事件日志中编写跟踪并执行包含"dir"的批处理文件.它现在将挂起proc.Start();
- 我尝试将帐户从LocalSystem更改为User,我设置了admnistrator用户和密码,仍然没有.
这是我用来执行批处理文件的内容:
proc.StartInfo.FileName = target; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.UseShellExecute = false; proc.Start(); proc.WaitForExit ( (timeout <= 0) ? int.MaxValue : timeout * NO_MILLISECONDS_IN_A_SECOND * NO_SECONDS_IN_A_MINUTE ); errorMessage = proc.StandardError.ReadToEnd(); proc.WaitForExit(); outputMessage = proc.StandardOutput.ReadToEnd(); proc.WaitForExit();
我不知道是否会为你做这个伎俩,但我没有悬挂的问题.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace VG { class VGe { [STAThread] static void Main(string[] args) { Process proc = null; try { string targetDir = string.Format(@"D:\adapters\setup");//this is where mybatch.bat lies proc = new Process(); proc.StartInfo.WorkingDirectory = targetDir; proc.StartInfo.FileName = "mybatch.bat"; proc.StartInfo.Arguments = string.Format("10");//this is argument proc.StartInfo.CreateNoWindow = false; proc.Start(); proc.WaitForExit(); } catch (Exception ex) { Console.WriteLine("Exception Occurred :{0},{1}", ex.Message,ex.StackTrace.ToString()); } } } }