我正在尝试使用以下代码通过c#控制台应用程序执行.bat文件: Service hangs up at WaitForExit after calling batch file
Kevin的解决方案有点可行,但我的.bat文件中的某些命令由于某种原因被忽略,但是当我手动执行.bat文件时,所有命令都可以正常工作。
e.g。从控制台应用程序执行.bat时xcopy命令不起作用,但启动命令工作正常。
知道为什么会这样吗?
P.S。最近我发现如果从命令提示符启动程序,它运行良好。怎么会?我还需要把它放在自动运行中,所以这并没有解决问题。
此外,如果通过单击exe文件启动,则输出显示
xcopy folder1 folder2
但如果从命令提示符启动,则输出显示
xcopy folder1 folder2
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();
答案 0 :(得分:2)
从服务执行命令处理器时,批处理文件命令 not 会被忽略。然而,它们很容易失败,并且由于您无法看到它们的输出而无法观察到。失败的典型原因是ProcessStartInfo.WorkingDirectory未正确设置,因此相对路径不再起作用或由使用与您从桌面使用的权限不同的其他用户帐户运行的服务导致的故障。 / p>
通过将输出重定向到文件来诊断问题,运行cmd.exe / c并使用>
运算符。附加2>&1
以使文件包含常规输出和错误输出。通过明智地使用%errorlevel% variable和EXIT command,您可以使用Process.ExitCode属性发现执行失败。