【问题标题】:Passing command prompt functions from java从 java 传递命令提示符函数
【发布时间】:2015-12-31 08:03:23
【问题描述】:

我想从 Java 中获取 windows 命令提示符函数的结果。

Java 代码:

Process process2 = Runtime.getRuntime().exec("cmd /c getmac");

除了Runtime,还有其他可用的库吗?

【问题讨论】:

  • 按照@v.ladyev 的建议考虑 Apache Commons Exec。并查看此 SO 帖子:stackoverflow.com/questions/6295866/…
  • @Aurelien ,我喜欢你的评论。将其发布为答案
  • @VINOTH KUMAR,您的问题是关于一般执行命令还是专门获取 mac 地址? Aurelien 建议使用此 mkyong.com/java/how-to-get-mac-address-in-java,它更简洁且不特定于平台,但我认为他删除了他的评论。
  • 使用ProcessBuilder,通过输入流重定向错误流,然后读取Process的InputStream,类似于this
  • @MadProgrammer 它工作正常。我正在开发一个 Java 程序来创建一个文件,该文件获取系统的用户名并将其存储到文本文件中。当我使用 Netbeans 中的 Inno 设置使其成为可执行文件时。它在安装文件夹中创建文本文件。但我需要在可执行文件存在的地方创建。如果是 pendrive,当我的应用程序执行时,它应该在 pendrive 中创建文件,而不是在安装目录中。如何克服这个问题?

标签: java windows command-line


【解决方案1】:

使用Apache Commons Exec。可用于获取正在运行的进程的控制台输出。

真实项目的部分代码

    private final Executor executor = new DefaultExecutor();

    private final ExecuteWatchdog watchDog = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT);

    private final ProcessDestroyer shutdownHookProcessDestroyer = new ShutdownHookProcessDestroyer();

    private final DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler() {
        @Override
        public void onProcessFailed(ExecuteException ex) {
            super.onProcessFailed(ex);
            LOG.error("Error executing xxx.exe", ex);
        }
    };

    public void startInSaveRecordMode(Long callId, File pathToResult) throws IOException {
        CommandLine commandLine = createModeUserPasswordCommandLine(SAVE_RECORD_MODE_COMMAND)
                .addArgument(ValidationUtil.toString(callId)).addArgument(
                        ValidationUtil.toString(pathToResult));
        execute(commandLine);
    }

    private void execute(CommandLine commandLine) throws IOException {
        Assert.notNull(pathToProcess);
        executor.setWatchdog(watchDog);
        executor.setProcessDestroyer(shutdownHookProcessDestroyer);
        executor.setStreamHandler(createStreamHandler());
        if (LOG.isDebugEnabled()) {
            LOG.debug("Executing " + commandLine);
        }
        executor.execute(commandLine, resultHandler);
    }

    private CommandLine createModeUserPasswordCommandLine(String mode) {
        Assert.hasLength(sensormUser);
        Assert.notNull(sensormPassword);
        return createCommandLine().addArgument(mode).addArgument(sensormUser);
    }

private CommandLine createCommandLine() {
    return new CommandLine(pathToProcess);
}

private ExecuteStreamHandler createStreamHandler() {
    OutputEventsHandler eventsHandler = new OutputEventsHandler(eventsQueue);
    SensormLogHandler errorLogHandler = new SensormLogHandler(LOG, Level.ERROR);
    return new PumpStreamHandler(eventsHandler, errorLogHandler);
}

public int waitFor() throws InterruptedException {
    resultHandler.waitFor();
    return resultHandler.getExitValue();
}

【讨论】:

  • 谢谢。它工作正常。我正在开发一个 Java 程序来创建一个文件,该文件获取系统的用户名并将其存储到文本文件中。当我使用 Netbeans 中的 Inno 设置使其成为可执行文件时。它在安装文件夹中创建文本文件。但我需要在可执行文件存在的地方创建。如果是 pendrive,当我的应用程序执行时,它应该在 pendrive 中创建文件,而不是在安装目录中。如何克服这个问题?
  • @VINOTHKUMAR 欢迎您。抱歉,我无法帮你解决这个问题。
猜你喜欢
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 2015-11-07
  • 1970-01-01
相关资源
最近更新 更多