批处理文件中的timeout命令无效

5

我正在尝试通过Tomcat应用程序调用批处理文件。批处理可以成功执行,但是在批处理中的超时命令无法暂停批处理。当直接执行批处理时,超时命令会按预期暂停进程。

我是这样调用批处理的: Runtime.getRuntime().exec("test.bat");


你是否使用了 /NOBREAK 选项来运行 TIMEOUT 命令?这将排除某种持续交互并模拟按键的可能性。 - Compo
2个回答

15
当您调用Runtime.getRuntime().exec()时,启动进程的输入和输出流将被重定向。由此启动的timeout继承相同的句柄。
问题在于timeout试图访问控制台, 但由于重定向而无法执行此操作。
您可以从控制台运行测试此行为。
<nul timeout /t 10 

当输入流被重定向时,timeout 失败。
一个解决方法可能是:
( timeout /t 10 || >nul ping -n 11 localhost ) 2>nul

如果timeout失败,则执行ping命令以强制等待。

已在Windows 10上进行测试,符合预期工作! - Gaurav

0
有点晚了,但也许对某些人有帮助。您可以在 .bat 文件中使用 PowerShell 命令,并使用 Java ProcessBuilder 保留标准输入但丢弃所有输出。
在 bat 文件中:
powershell -noprofile -command "& {[system.threading.thread]::sleep(5000)}"

Java:

ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/C", "do.bat");
            processBuilder.inheritIO();
            processBuilder.redirectError(ProcessBuilder.Redirect.DISCARD);
            processBuilder.redirectOutput(ProcessBuilder.Redirect.DISCARD);
            processBuilder.start();

这将静默执行批处理文件,包括等待。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接