【问题标题】:Skip the pause command in a batch from a java process从java进程中批量跳过暂停命令
【发布时间】:2013-07-17 15:24:21
【问题描述】:

我正在使用 java Process 类来执行一些批处理文件。我正在使用ProcessBuilder 创建流程,这部分运行良好。我的问题是处理我正在运行的批处理文件中的pausecommand。 pause 命令当前正在挂起批处理的执行,但我需要完成批处理,这样我才能恢复挂起的操作。目前,我正在使用与此等效的代码开始批处理:

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;


public class BatchEnter {

    public static void main(String[] args) throws Exception {
        List<String> params = Arrays.asList(new String[]{"cmd", "/C", "C:/test/test.bat"});
        ProcessBuilder builder = new ProcessBuilder(params);
        builder.directory(new File("C:/test")).redirectErrorStream(true);
        Process p = builder.start();

        BufferedReader wr = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = "";
        while((line = wr.readLine())!=null){
            System.out.println(line);
        }

        p.waitFor();
    }
}

我知道我们可以使用这个"hack" 来跳过批处理文件中的pause 命令。但是,我的问题是我无法更改正在使用的任何批处理文件,也无法添加批处理文件来调用另一个批处理,如提供的链接中所示。

我想知道有没有办法指定进程跳过暂停命令?

【问题讨论】:

  • 您可以复制批处理文件,删除 PAUSE 并运行复制。或者您可以向进程输出流发送击键(不确定它是否有效)。
  • 您的批处理脚本需要多长时间才能在没有暂停的情况下完成执行?
  • 不同批次有不同的执行时间。 @assylias 如果批处理文件没有调用其他任何内容,这是一个不错的选择,但不幸的是,情况并非总是如此。
  • 如果您知道执行时间,您可能会猜到批处理执行完成并使用 p.destroy() 杀死进程。同样,这不是一个好的解决方案,但仍然可能对您有用。
  • @JtheRocker 感谢您的提议,我会考虑的。实际上在我们的应用程序中运行批处理并不是我们想要的,但由于这是一项要求,我们必须做一些我不一定同意的 hack。

标签: java batch-file


【解决方案1】:

正如 assylias 所说,您只需要打开一个输出流并将命令发送到脚本即可。这将帮助您解决停顿问题。

Sending commands to a console application?

有例子。我以前做过的一件事是一次只读一行。如果行字符串与提示请求匹配,则在发生这种情况时发送换行符。这样您就不必担心哪些脚本有提示或提示频率。

【讨论】:

  • If the line string matches the prompt request 我应该等待的线路到底是什么?我用一个基本的批处理文件做了一些测试,没有迹象表明暂停命令已执行
  • 我在那里含糊不清,因为这取决于他们用来暂停的内容。在 cisco 上有一个 --More-- 需要寻找的东西,在我写的一些 shell 脚本中,有一个“Press Any Key”字符串,所以我会寻找它。对于这些,脚本暂停时是否会打印任何内容?你能在批处理文件中插入一些东西来回显到屏幕上吗?
  • 感谢您的建议,但我不能依赖它,因为暂停前没有标准输入,我无法修改批处理,但感谢它仍然是一个有效的选项。
  • 这人太粗鲁了!我唯一能猜到的另一件事是——如果你打开一个输出流并每隔一秒左右向进程发送一个换行符直到进程关闭怎么办?我建议,因为该过程将忽略任何无用的换行符,但是当它确实暂停时,那里会有一个换行符跳过暂停。这个想法的关键是在不需要时发送换行符必须是无害的,但根据你的描述,我认为这可能有效?
  • 我做了一点测试,发送换行符可以绕过批处理文件的暂停命令。在接受您的回答之前,我会稍等片刻。我会自己做一个来展示我所做的和我最后的“修复”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 2015-03-15
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多