我有一项有时会调用批处理文件的服务。批处理文件需要 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()
. 我必须从进程中终止批处理文件才能继续。(我确定该文件存在,因为我可以在进程列表中看到它。)
我该如何解决这个挂断问题?
更新#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
路径很好。输出目录确实存在并且仍然在服务之外工作。有任何想法吗?
更新#2:
我写了“C:\EnterpriseDB\Postgres\8.3\bin\pg_dump.exe”,而不是批处理文件的路径,proc.StartInfo.FileName
并将所有参数添加到proc.StartInfo.Arguments
. 结果没有改变,但我pg_dump.exe
在进程窗口中看到了。同样,这只发生在服务内部。
更新#3:
我已经使用管理员组中的用户运行该服务,但无济于事。我恢复null
了服务的用户名和密码
更新#4:
我创建了一个简单的服务来在事件日志中写入跟踪并执行其中包含“dir”的批处理文件。它现在会挂起proc.Start();
- 我尝试将帐户从 LocalSystem 更改为User并设置管理员用户和密码,但仍然没有。