一尘不染

调用批处理文件后,服​​务在WaitForExit挂断

c#

我有一项有时会调用批处理文件的服务。批处理文件需要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本地主机-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,
然后设置了管理员用户和密码,但仍然没有。


阅读 230

收藏
2020-05-19

共1个答案

一尘不染

这是我用来执行批处理文件的内容:

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();

我不知道这是否可以帮到您,但是我没有问题的困扰。

2020-05-19