2

我正在尝试使用此处的代码通过 ac# 控制台应用程序执行 .bat 文件: Service hangs up at WaitForExit after calling batch file

凯文的解决方案有点工作,但我的 .bat 文件中的一些命令由于某种原因被忽略了,但是当我手动执行 .bat 文件时,所有命令都可以正常工作。

例如,xcopy 命令在从控制台应用程序执行 .bat 时不起作用,但 start 命令工作正常。

知道为什么会这样吗?

ps 最近我发现如果程序是从命令提示符启动的,它运行良好。怎么来的?我仍然需要将其置于自动运行状态,所以这并不能解决问题。

此外,如果通过单击 exe 文件启动,输出显示

xcopy 文件夹1 文件夹2

但如果从命令提示符启动,输出显示

xcopy 文件夹1 文件夹2

smth/smth.smth 已复制

……

复制了 5 个文件。

它实际上正在被复制。

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

1 回答 1

2

当您从服务执行命令处理器时,批处理文件命令不会被忽略。然而,它们很容易失败并且可以在不被观察的情况下这样做,因为你看不到它们的输出。失败的典型原因是 ProcessStartInfo.WorkingDirectory 设置不正确,因此相对路径不再起作用,或者由使用不同用户帐户运行的服务引起的问题,该用户帐户与您在桌面上使用的用户帐户没有相同的权限。

通过将输出重定向到文件来诊断问题,运行 cmd.exe /c 并使用>操作符。追加2>&1以便文件包含常规和错误输出。并且通过明智地使用%errorlevel% 变量EXIT 命令,您可以通过使用 Process.ExitCode 属性发现执行失败。

于 2012-05-13T13:51:50.700 回答