exit /b 0 returns 1 in process.exitValue if 运行 as non-admin on Windows Server 2016
exit /b 0 returns 1 in process.exitValue if run as non-admin on Windows Server 2016
我有以下 java class 和一个批处理文件。
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");
}
}
}
脚本内容-util.bat只有一行,
案例 1:
exit /B 0
案例 2:
exit /B 2
案例 3:
exit 0
案例 4:
exit 2
案例 5:
rem exit 0
"java testc" 的输出,批处理文件包含案例 1 的内容,当 运行 在非 evevated 命令提示符下:
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 的输出 returns 代码 1 而不是 0。
任何其他情况的输出,或者当 运行 从提升的命令提示符中的同一工作目录反映正确的错误级别代码时的所有情况。
我的问题是,如果不是 运行 作为管理员,为什么退出代码是 returns 1 而不是 0?
环境:
Windows 服务器 2016 x64,JDK 1.8
编辑:这个问题似乎是特定于环境的。使用 JDK 1.8 u151 安装 Windows Server 2016 10.0.14393 的行为与上述相同,而另一个相同版本则不然。无论如何,这在任何环境下都是不期望的。
我们与客户合作找出了原因。
如果打开它的用户当时具有管理权限,系统正在使用 shell 脚本为 cmd window 设置不同的颜色。导致退出代码更改的命令包含在自定义脚本中 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"
我有以下 java class 和一个批处理文件。
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");
}
}
}
脚本内容-util.bat只有一行,
案例 1:
exit /B 0
案例 2:
exit /B 2
案例 3:
exit 0
案例 4:
exit 2
案例 5:
rem exit 0
"java testc" 的输出,批处理文件包含案例 1 的内容,当 运行 在非 evevated 命令提示符下:
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 的输出 returns 代码 1 而不是 0。 任何其他情况的输出,或者当 运行 从提升的命令提示符中的同一工作目录反映正确的错误级别代码时的所有情况。
我的问题是,如果不是 运行 作为管理员,为什么退出代码是 returns 1 而不是 0?
环境: Windows 服务器 2016 x64,JDK 1.8
编辑:这个问题似乎是特定于环境的。使用 JDK 1.8 u151 安装 Windows Server 2016 10.0.14393 的行为与上述相同,而另一个相同版本则不然。无论如何,这在任何环境下都是不期望的。
我们与客户合作找出了原因。 如果打开它的用户当时具有管理权限,系统正在使用 shell 脚本为 cmd window 设置不同的颜色。导致退出代码更改的命令包含在自定义脚本中 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"