java - 从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);
}
X和Y是来自配置文件的一些输入参数,可能包含也可能不包含任何数据。
当x或y未定义时,一切都按假设工作,输出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 位置。
解决方案
好吧,您说过:“它甚至没有输出真实的回声”。当您添加调试行时,它..有助于思考它的含义。'x' 未定义,或 'y' 未定义(或很可能两者均未定义)。
您可以管理衍生进程的环境,使用ProcessBuilder
,并在启动之前(使用例如start()
),首先设置环境;例如与pb.environment.put("x", "hello");
.
但是,为什么要从 java 运行批处理脚本?它们在 80 年代是糟糕的技术,此时有大量的替代品。如果您通过批处理文件来解释您想要完成的工作,也许一个有进取心的 SO 读者可以提出一些有用的建议。
推荐阅读
- javascript - React Ref:对象数组的 Ref 函数仅记录第一项
- firebase-hosting - 尝试在托管 Web Flutter 应用程序的 Firebase 中部署
- c - 如何在c中重命名文件
- events - 点击传单标记
- python - 从 AWS Lambda 层导入 cffi python 模块时出错
- typescript - 根据变量输入键入回调函数
- google-bigquery - Google Cloud Data Fusion 将 Excel 提取到 Bigquery
- php - 传递参数的php soap调用问题
- sed - 带 sed 的 while 循环。用另一个文件中的文本替换一个文件中的匹配模式
- .net-core - 从外部二进制文件构建 NuGet 包