我有以下java类和一个批处理文件。
测试.java:
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Map;
public class testc {
public static void main(String[] mainargs) {
System.out.println("Java class initiated");
try {
String line;
ArrayList<String> args = new ArrayList<String>();
String script = "script-util.bat";
args.add(script);
ProcessBuilder pb = new ProcessBuilder(args);
Map<String, String> env = pb.environment();
System.out.println("Starting batch file");
Process process = pb.start();
InputStream is = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
while (null != (line = reader.readLine())) {
System.out.println("OUT: " + line);
}
System.out.println("Waiting for complete exit");
int returnCodeW = process.waitFor();
int returnCodeE = process.exitValue();
System.out.println("returnCodeW: " + returnCodeW);
System.out.println("returnCodeE: " + returnCodeE);
}
catch (Throwable t) {
System.out.println("Exception caught");
}
}
}
脚本实用程序的内容.bat只是一行,
案例1:
exit /B 0
案例2:
exit /B 2
案例3:
exit 0
案例4:
exit 2
案例5:
rem exit 0
"java testc"的输出,其中批处理文件在非脚本命令提示符下运行时具有案例 1 中的内容:
c:javatest2>java testc
Java class initiated
Starting batch file
OUT:
OUT: c:javatest2>exit /B 0
Waiting for complete exit
returnCodeW: 1
returnCodeE: 1
案例 5 的输出也返回代码 1 而不是 0。任何其他事例的输出,或在提升的命令提示符下从同一工作目录运行时的所有事例的输出反映正确的错误级别代码。
我的问题是,如果不以管理员身份运行,为什么退出代码返回 1 而不是 0?
环境:Windows Server 2016 x64, JDK 1.8
编辑:此问题似乎是特定于环境的。使用 JDK 1.8 u151 的 Windows Server 2016 10.0.14393 的一个安装行为如上所述,而另一个相同的版本则不然。无论如何,这在任何环境下都是意料之中的。
在与客户的合作中,我们找到了原因。如果打开cmd窗口的用户当时具有管理权限,则系统正在使用shell脚本将不同的颜色放入cmd窗口。导致退出代码更改的命令包含在自定义脚本 shell_color.cmd 中:
@echo off
rem The following line is the root cause
bcdedit 1>NUL 2>&1
rem bcdedit returns exit code 1 for some reason when run as non-admin
if %errorlevel%==1 goto user
color 4f
goto end
:user
color 0f
:end
Windows 注册表需要按以下方式引用此脚本:
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor]
"autorun"="%windir%\system32\shell_color.cmd"