1

我正在写这个与我之前的主题相关的问题:

从 java 代码运行 bat 文件以在 txt 文件中获得所需的结果 - 没有办法:( 简而言之:我用 java 编写了一个运行 bat 文件的程序。此 bat 文件运行执行桌面应用程序测试的 TestComplete8 脚本。测试完成后,bat 文件生成名为 result.txt 的文件,并将测试信息打印到该文件中。我现在遇到了另一个问题:现在从我的 java 代码中,我想等到 bat 运行完成。我通过循环直到存在名为 result.txt 的文件来做到这一点。我猜这不是最好的解决方案,但我认为它可以工作,也尝试了不同的解决方案。发生的情况是它将正常循环并等到文件存在,但 testcomplete 不执行测试。这很奇怪,因为 testcomplete 运行,我可以看到测试开始了,我的 AUT 也开始了,但没有任何反应。Testcomplete 正在等待任何对象并且没有 t 单击任意位置,等待预定义的操作时间用完。当我在代码中没有任何等待的情况下运行测试时,一切都很好。我只是不明白为什么在启用等待时测试期间什么都没有发生,为什么当我删除任何 do-while 或 waitFor() 时它工作正常,甚至我尝试在单独的线程中运行它。:(

我有一种感觉,它可能与操作系统有某种关系,并且与进程有关,因为它运行类似于 bat 作为进程的东西,而不是 bat 运行它的子进程作为 testcomplete 或类似的东西。感谢您的任何回答

所要求的源代码:现在我正在尝试使用修改后的 bat 文件的解决方案:

@ECHO OFF
"C:\Program Files (x86)\Automated QA\TestComplete 8\Bin\TestComplete.exe" "C:..." /r /p:projname PathToApp="C:\...p" Login=... Password=B1  /t:"KeywordTests|..." /exit

在最新版本中运行和等待的代码是:

        new Thread(new Runnable() {
        public void run() {
            File file = new File("D:\\");
            int exitValue = -1;

            try {
                Process process = Runtime.getRuntime().exec(batch, null, file);
                while (true) {
                    try {
                        exitValue = process.exitValue();
                        System.out.println(exitValue);
                        break;
                    } catch (IllegalThreadStateException e) {
                        // e.printStackTrace();
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                        System.out.println("Waiting for process...");
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
4

1 回答 1

2

最可能的原因是在从 Java 启动外部进程时面临的常见问题,但对问题没有更多了解。启动外部进程时,在父进程和子进程之间创建三个流,输入、输出、错误。

您可以将它们比作 System.in、System.out 和 System.err。如果父进程 (Java) 没有主动消耗输出和错误流上的数据,则子进程可能会阻塞,因为操作系统将达到流的缓冲区限制并阻止任何更多的写入,直到它被消耗。如果您的脚本写入标准输出或标准错误,这很可能发生。

我建议使用 apache commons-exec 来处理 Java 进程启动。

这是我知道有效的代码示例。

    CommandLine commandLine = new CommandLine( "TestComplete8.bat" );
    commandLine.addArgument( ... );
    commandLine.addArgument( ... );

    DefaultExecutor executor = new DefaultExecutor();
    executor.setExitValue( 0 );
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ByteArrayOutputStream errorStream = new ByteArrayOutputStream();
    executor.setStreamHandler( new PumpStreamHandler( outputStream, errorStream ) );

    try
    {
        executor.execute( commandLine );
    }
    catch ( ExecuteException e )
    {
        // TODO: ...
    }
    catch ( IOException e )
    {
        // TODO: ...
    }

然后,如果您愿意,您可以在执行返回时检查输出/错误流。

于 2011-07-29T07:33:10.480 回答