java - 写几行批处理

标签 java batch-file input process output

我正在尝试为简单的批处理文件提供输入,该文件需要两行输入:

@echo off

set /p file1="Enter: "
set /p file2="Enter: "
echo "1" > %file2%

我的代码是:

public static void main(String[] args) throws Exception {
    Process p = new ProcessBuilder("cmd.exe",  "/c", "test.cmd").start();

    try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()))) {
        bw.write("1");
        bw.newLine();
        bw.write("2");
        bw.newLine();
    }
}

我预计将创建名为“2”的文件,但什么也没有发生。

这段代码有什么问题?

最佳答案

试试这个。

try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
                InputStream in = p.getInputStream()) {
            in.read();
            bw.write("1");
            bw.newLine();
            bw.flush();
            bw.write("2");
            bw.newLine();
            bw.flush();
        }

基本上,你必须在写作之前阅读内容。 否则,Java 甚至可能在子进程提示输入之前就开始写入。所以你的写法不会考虑。

别忘了冲水

您可以使用waitFor进行调试,而无需读取。它将永远等待获取输入。

注意**,文件位置基于第二行中的输入。在您的情况下,它将在执行 java 的目录中创建。

相反,您可以尝试实际的路径,例如。

bw.write("C:/projects/test.txt");

将根据 cmd 中的命令在指定路径中创建

更新 我想我确实解释了为什么我们需要先调用 read 。让我尝试用我理解的方式详细解释一下。

通过调用process.getRunTime().exec - 您正在创建可以并行运行的新进程。您的主进程将立即开始进程。所以我们有两个进程(1.我们启动的主进程2.)都是并行运行的。假设主进程在子进程(cmd)提示之前执行下一行(写入)(因为两者是并行的。这可能会发生)。主进程在子进程上写入的内容都是浪费,因为子进程不处于监听模式。

这就是为什么我们从主进程中调用读取子进程的原因。这样主进程就会等待子进程提示输入。

关于java - 写几行批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994023/

相关文章:

powershell - 如何更改 Windows 控制台 CMD 或 WSL 中的键盘布局?

Haskell 将用户输入存储在数组中

c++ - 输入大字符串的最快方法?

windows - 在 Windows 登录窗口之前启动批处理脚本

javascript - 将 HTML 输入更改为 textarea 并复制所有事件

java - 套接字未在 Android 上关闭

java - 如何使用 Realm 创建递归关系?

java - Spring MVC 或 Spring Boot 可以与 Amazon Alexa 配合使用吗?

java - 将 POST 发送到 Web 服务并验证一些数据并以 JSON 形式发回

batch-file - NSI 脚本相当于 bat 脚本