【发布时间】:2010-09-26 13:00:03
【问题描述】:
我有一项服务有时会调用批处理文件。批处理文件执行需要 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:
Kevin 的代码可以让我得到输出。我的一个批处理文件仍然挂起。
"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:
我为proc.StartInfo.FileName写了“C:\EnterpriseDB\Postgres\8.3\bin\pg_dump.exe”而不是批处理文件的路径,并将所有参数添加到proc.StartInfo.Arguments。结果没有改变,但我在进程窗口中看到了pg_dump.exe。同样,这只发生在服务内部。
更新 #3:
我已经使用管理员组中的用户运行该服务,但无济于事。我为服务的用户名和密码恢复了null
更新 #4:
我创建了一个简单的服务来在事件日志中写入跟踪并执行其中包含“dir”的批处理文件。现在它将挂在proc.Start(); - 我尝试将帐户从 LocalSystem 更改为 User 并设置管理员用户和密码,但仍然没有。
【问题讨论】:
-
@nzpcmad:你到底是从哪里想到改变 OP 的标签的?
-
我不是 nzpcmad,但我的猜测是:既然他说“我有一个 Web 服务”,我假设他有一个 Web 服务 (.asmx) 而不是 Windows 服务。
-
@Michael:我不明白这如何保证/更改/ OP 的标签。
-
不是webservice,第一行写的,嗯,可能很累。好的是“服务”。对不起。
-
@Daok:我想通了,但标签还是由你决定。
标签: c# .net service windows-services