如果在Windows Server 2016上以非管理员身份运行,则exit / b 0在process.exitValue中返回1

时间:2018-01-31 13:25:30

标签: java batch-file cmd exit windows-server-2016

我有以下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

在非evevated命令提示符下运行时,带有来自案例1的内容的批处理文件的“java testc”的输出:

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安装行为与上面相同,而另一个相同版本的安装没有。无论如何,在任何环境下都不会这样。

1 个答案:

答案 0 :(得分:1)

与客户合作,我们找到了原因。 如果打开它的用户当时具有管理权限,则系统使用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"