gpt4 book ai didi

java - 使用 Runtime.exec() 未完全执行 BAT 文件

转载 作者:行者123 更新时间:2023-12-01 17:33:25 30 4
gpt4 key购买 nike

我有一个 BAT 文件,它通过读取 DB 表来创建许多 csv 文件。 bcp.exe 用于此目的,因此,对于从表创建的每个 CSV,都有一个单独的 bcp.exe 调用。所有这些都可以在 BAT 文件中找到,我使用 Runtime.exec() 调用该文件。

现在我面临的问题是随机的。它无法在开发环境中重新创建,但在生产环境中偶尔会发生。

有时执行 BAT 文件后,只创建了少数 CSV 文件,其余的都丢失了。但是当您重新执行相同操作时,您将获得所有 CSV。

代码如下:

        String command = "cmd /C " + batFilePath + " " + batParams;
LOGGER.info("Executing : " + command);
Runtime rt = Runtime.getRuntime();
Process process = rt.exec(command);

process.getInputStream();
is = process.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);

String line;

while ((line = br.readLine()) != null) {
LOGGER.info(line);
}

如果有人能告诉我这是如何发生的,我将非常感激,因为我对此感到茫然。

提前致谢,

-拉杰。

最佳答案

简单说几点。

首先,我一直不明白为什么 Java 坚持使用 getInputStream 获取进程的输出流 - 这太奇怪了。但这只是我的咆哮,你对此无能为力:-)

其次,我不确定为什么你的代码中有一个“裸”的 process.getInputStream(); 。我不认为这有什么坏处,但似乎没有必要。

第三(说实话,这是我认为唯一可能有帮助的),您需要调试批处理文件本身而不是 Java 代码。

这可以通过以下两个建议来完成。

首先,获取错误流并查看它。 cmd 很可能正在提供您只是忽略的错误信息。

其次,更改批处理文件以输出大量调试语句,如有必要,每行后输出一个。这有望将问题查明到批处理文件中的特定位置。

如果它只发生在生产中(并且间歇性地),那就更难了,但我们通常发现我们的客户非常愿意接受调试式临时补丁,因此我们可以收集信息来解决他们遇到的问题。

简单记录的批处理文件的输出也是低风险的更改。有些调试代码的风险并不低,我们必须在涉及客户生产系统之前非常彻底测试。有些人会直截了本地拒绝,这是一个并非不明智的立场。

关于java - 使用 Runtime.exec() 未完全执行 BAT 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8753647/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com