我有以下java类和批处理文件。
testc.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");
}
}
}
script-util.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的一种安装方式与上述行为相同,而另一相同版本的安装则不具有上述行为。无论如何,在任何环境下都不会出现这种情况。
最佳答案
与客户合作,我们找到了原因。
如果当时打开系统的用户具有管理权限,则系统使用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_MACHINE\SOFTWARE\Microsoft\Command Processor]
"autorun"="%windir%\\system32\\shell_color.cmd"