当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《调用批处理文件后,服​​务在WaitForExit处挂起》经验,为你挑选了2个好方法。

我有一个服务有时会调用批处理文件.批处理文件需要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路径很好.输出目录确实存在,仍然可以在服务外部运行.有任何想法吗?

更新#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,我设置了admnistrator用户和密码,仍然没有.



1> kemiller2002..:

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

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

我不知道是否会为你做这个伎俩,但我没有悬挂的问题.


呸,abbrs =邪恶.
是的.否=数字
为什么一秒钟没有毫秒?

2> 小智..:
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());
                }
            }
        }
    }

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有