从Java运行.bat文件时出现问题 @echo关闭 如果“%1”=“”( 回显“用法:” )否则( 如果不存在“abc\cdf”mkdir abc\cdf 如果不存在“xyz”mkdir xyz 如果不存在“xyz\mno”mkdir xyz\mno xcopy导出xyz\mno/e 设置xyz_JAR=xyz.JAR 设置xyz_JAR_PATH=..\app\build\libs\ set FILES=mno“%xyz\u JAR%” 复制“%xyz\u JAR\u路径%%xyz\u JAR%”xyz //复制..\app\build\libs\xyz.jar xyz 设置ZIP_FILE=xyz_v0-8-0_export.ZIP 如果存在“xyz\mno\.zip”del xyz\mno\.zip cd“xyz” 回显“%cd%” zip-r%zip\u文件%%FILES% 删除%xyz_JAR% echo y | del mno\config\** rmdir mno\config rmdir mno\out 回音y | del/s mno\ rmdir mno 移动%ZIP\u文件%..\%1\%ZIP\u文件% 光盘 rmdir-xyz )

从Java运行.bat文件时出现问题 @echo关闭 如果“%1”=“”( 回显“用法:” )否则( 如果不存在“abc\cdf”mkdir abc\cdf 如果不存在“xyz”mkdir xyz 如果不存在“xyz\mno”mkdir xyz\mno xcopy导出xyz\mno/e 设置xyz_JAR=xyz.JAR 设置xyz_JAR_PATH=..\app\build\libs\ set FILES=mno“%xyz\u JAR%” 复制“%xyz\u JAR\u路径%%xyz\u JAR%”xyz //复制..\app\build\libs\xyz.jar xyz 设置ZIP_FILE=xyz_v0-8-0_export.ZIP 如果存在“xyz\mno\.zip”del xyz\mno\.zip cd“xyz” 回显“%cd%” zip-r%zip\u文件%%FILES% 删除%xyz_JAR% echo y | del mno\config\** rmdir mno\config rmdir mno\out 回音y | del/s mno\ rmdir mno 移动%ZIP\u文件%..\%1\%ZIP\u文件% 光盘 rmdir-xyz ),java,windows,batch-file,Java,Windows,Batch File,这是我的.bat文件,它完全是从命令行执行的。我想从java运行同样的程序,在java中我看到了不同阶段的问题 String命令=“packageEGRC\u export.bat”+“”+“exportEGRC”; Process Process=Runtime.getRuntime().exec(新字符串[]{“cmd.exe”,“/c”,command},null,scriptDir); InputStream=process.getInputStream(); int i=0; 而((i

这是我的.bat文件,它完全是从命令行执行的。我想从java运行同样的程序,在java中我看到了不同阶段的问题

String命令=“packageEGRC\u export.bat”+“”+“exportEGRC”;
Process Process=Runtime.getRuntime().exec(新字符串[]{“cmd.exe”,“/c”,command},null,scriptDir);
InputStream=process.getInputStream();
int i=0;
而((i=is.read())!=-1){
系统输出打印((字符)i);
}
process.waitFor();
int exitValue=process.exitValue();
它是拾取bat文件并执行到某个阶段,然后在第行失败

    copy "%xyz_JAR_PATH%%xyz_JAR%" xyz
表示无法找到文件路径。但是如果我用它来代替它,它就可以正常工作了

    copy ..\app\build\libs\xyz.jar xyz
接下来,如果无法将目录更改为xyz-->
cd“xyz”
,它将保持正在执行的工作目录不变

在此方面的任何帮助都将不胜感激

注意:我不想更改.bat文件的任何内容,因为它在命令行中工作得非常好。

1)使用绝对路径
2) 不要使用cd,使用pushd更改目录,使用popd更改回原来的目录。

看起来问题出在.bat文件本身:您在if语句中设置了变量,但在执行之前必须完全读取该语句(复合表达式)。它是替换变量的地方。当您使用Java执行脚本时,还没有设置任何环境变量,因此无法使用表达式

cd "%var%"
填充了空字符串,因此找不到错误pops

如果您在输入前重写代码以设置变量,那么它是否有效

当从命令行调用时,您还可以观察脚本的工作情况,因为这些变量在第一次调用脚本之后就已经设置好了。只需在新打开的cmd.exe中检查原始脚本是否工作。你的脚本应该失败

以下是一个例子:

@echo off

if "%1" == "" (
    set xyz_JAR=xyz.jar
    set xyz_JAR_PATH=..\bat\

    echo "%xyz_JAR_PATH%%xyz_JAR%"
)
和调用:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

D:\tmp\bat>test.bat
""

D:\tmp\bat>test.bat
"..\bat\xyz.jar"

D:\tmp\bat>

如果像引用那些环境变量一样引用相对路径,会发生什么情况?尝试了pushd xyz并尝试使用echo“%cd%”打印当前工作目录-->似乎保持相同的工作目录,而没有更改为xyz文件夹。此外,进程还有STDIN(process.getOutputStream())和STDERR(process.getErrorStream())这会阻止你的脚本。所以,要么在流程开始后立即关闭它们,要么也读取它们。