【问题标题】:Need to start process which needs admin rights from Java code and get back errorlevel需要从 Java 代码启动需要管理员权限的进程并返回错误级别
【发布时间】:2015-04-05 08:28:56
【问题描述】:

我有需要管理员权限才能运行的 exe 文件。我以这种方式使用 ProcessBuilder:

ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/C", "start", "/wait", "myexe.exe", "&", "echo", "%errorlevel%");
Process p = processBuilder.start();

作为 ProcessBuilder 构造函数参数的一部分,必须有 cmd.exe /C,因为没有它就无法启动 myexe.exe - 我总是收到错误消息

请求的操作需要提升。

使用cmd.exe /C 正常启动,UAC 询问我是否确定启动它。但后来我得到了

java %errorlevel% from cmd.exe (process.exitValue()) 

myexe.exe 中始终为 0 而不是 %errorlevel%。

然后我尝试通过& end echo %errorlevel% 连接命令。然后我打开输入流并读取 echo 写入的内容。它总是读取 0。

它在批处理文件中工作:

myexe.exe
echo %errorlevel&

但不像 ProcessBuilder 那样内联。有什么帮助吗?

【问题讨论】:

    标签: java windows cmd


    【解决方案1】:

    要获得“错误级别”(实际上是进程退出值),您可以使用类似

    Process p = processBuilder.start();
    int errorLevel = p.waitFor();
    

    Process.waitFor()Javadoc 说(部分),

    返回:

    Process 对象表示的子进程的退出值。按照约定,0 表示正常终止。

    【讨论】:

    • 它不起作用。 waitFor() 返回 0,但如果我从 cmd 行运行 myexe.exe 然后 echo %errorlevel% 我得到 544。
    • @bizdej 那我觉得你倒霉了。以上是如何从 Java 子进程中获取“错误级别”。
    • 是的,但 my.exe 在这种情况下是 java subsubsubprocess ;)。 cmd.exe 是子进程。那就是问题所在。可能是我需要准备将 %errorlevel% 存储到文件中的批处理文件,我的 java 应用程序会读取它,但这是一个非常肮脏的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    相关资源
    最近更新 更多