【问题标题】:How to run windows cmd command "query session" in processbuilder in Java?如何在 Java 的 processbuilder 中运行 windows cmd 命令“查询会话”?
【发布时间】:2015-10-15 12:40:29
【问题描述】:

这就是我正在尝试的

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "\"query && session\"");

但我得到了错误:

'query' is not recognized as an internal or external command,
operable program or batch file.

我在这里做错了什么?

【问题讨论】:

  • 您需要query session提供哪些信息?也许还有其他方法可以得到它们。

标签: java cmd processbuilder


【解决方案1】:

原因是您在 64 位 Windows 上运行 32 位 Java VM。在这种情况下,%SystemRoot%\syswow64\cmd.exe 将被执行,而不是 %SystemRoot%\system32\cmd.exe

小例子

public static void main(String[] args) throws Exception {
    for (String s : Arrays.asList("java.vm.name", "sun.arch.data.model")) {
        System.out.printf("%s=%s%n", s, System.getProperty(s));
    }
    ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "query session");
    pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
    pb.redirectError(ProcessBuilder.Redirect.INHERIT);
    pb.start();
}

在 64 位 Windows 上使用 32 位 JVM 输出

java.vm.name=Java HotSpot(TM) Client VM
sun.arch.data.model=32
'query' is not recognized as an internal or external command,
operable program or batch file.

在 64 位 Windows 上使用 64 位 JVM 输出

java.vm.name=Java HotSpot(TM) 64-Bit Server VM
sun.arch.data.model=64
 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           .....                     1  Active

编辑

%SystemRoot%\syswow64\cmd.exe 不知道查询命令。

C:\Windows\SysWOW64>cmd
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Windows\SysWOW64>query
'query' is not recognized as an internal or external command,
operable program or batch file.

%SystemRoot%\system32\cmd.exe知道查询命令。

C:\Windows\System32>cmd
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Windows\System32>query
Invalid parameter(s)
QUERY { PROCESS | SESSION | TERMSERVER | USER }

【讨论】:

  • 非常感谢让我朝这个方向思考。让我纠正我的设置。
  • 我明确提到从 System32 打开 cmd.exe,如下所示: ProcessBuilder pb = new ProcessBuilder("C:\\Windows\\System32\\cmd.exe", "/c" , "\"查询 && 会话\"");仍然是同样的错误。 :(
  • 我需要强制 JVM 运行 C:\Windows\System32>cmd 而不是 C:\Windows\SysWOW64>cmd。我该怎么做?
  • 使用 64 位 JVM。不然我也没办法。您可以手动尝试:1) 运行:C:\Windows\SysWOW64,2) 在 C:\Windows\System32\cmd.exe 内启动,3) 查询会话。你会发现这不起作用。
  • 非常感谢大家的支持。 :) 非常感谢
【解决方案2】:

尝试以交互方式进行...这行得通吗?

ProcessBuilder pb = new ProcessBuilder("cmd.exe");
pb.redirectErrorStream(true);
Process p = pb.start();
PrintWriter writer = new PrintWriter(p.getOutputStream());
writer.println("/c \"query && session\"");

【讨论】:

  • 感谢您的回复。我确实尝试过 new ProcessBuilder("cmd.exe", "cmd.exe /c", "\"query && session\"");但它没有用。 :(
  • 你能把它包起来吗:String[] cmd = new String[]{"cmd.exe", "/C", "START", "query", "session"}; ProcessBuilder pbs = new ProcessBuilder(cmd); pbs.start();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 2018-03-15
  • 2020-11-23
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多