首页 > 解决方案 > 从java调用时批处理goto:eof不起作用

问题描述

我有一个大致包含以下代码的批处理文件:

@echo off
(
    set /p x=
    set /p y=
) < settings.cdb

IF DEFINED x (
    IF DEFINED y (
        ECHO true
        GoTo :EOF
    )
)
ECHO false
GoTo :EOF

在 Java 中,我有以下代码通过命令行调用批处理文件:

ProcessBuilder probuilder = new ProcessBuilder(command);
Process pr = probuilder.start();

BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));

String line;
while ((line = input.readLine()) != null)
{
    lines.add(line);
}

XY是来自配置文件的一些输入参数,可能包含也可能不包含任何数据。

xy未定义时,一切都按假设工作,输出false.

当变量都被定义时,问题就来了。当通过命令行调用批处理文件时,我得到结果输出:true.
这是预期的输出。

当我通过 Java Process 调用同一个批处理文件时,我得到以下输出:false.
这不是我想要的。

删除@echo off我从命令行运行批处理文件得到以下输出:

IF DEFINED x (IF DEFINED y (
ECHO true
 GoTo :EOF
) )
true

但是当我从 Java Process 运行它时:

IF DEFINED x (IF DEFINED y (
ECHO true  
 GoTo :EOF 
) ) 
ECHO false 
false
GoTo :EOF 

它甚至没有输出echo true.

我试过用EXIT /b 0而不是GoTo :EOF但结果相同。

那么我在这里错过了什么?为什么从 Java 调用该程序时,即使它有一个GoTo :EOF?
为什么输出不同?它是Java的东西吗?是批量的吗?

更新

毕竟,加载变量的所有文件都相对于命令行位置而不是 bat 位置。

标签: javabatch-file

解决方案


好吧,您说过:“它甚至没有输出真实的回声”。当您添加调试行时,它..有助于思考它的含义。'x' 未定义,或 'y' 未定义(或很可能两者均未定义)。

您可以管理衍生进程的环境,使用ProcessBuilder,并在启动之前(使用例如start()),首先设置环境;例如与pb.environment.put("x", "hello");.

但是,为什么要从 java 运行批处理脚本?它们在 80 年代是糟糕的技术,此时有大量的替代品。如果您通过批处理文件来解释您想要完成的工作,也许一个有进取心的 SO 读者可以提出一些有用的建议。


推荐阅读