如何在GUI界面中(使用Java)获取主板序列号

6
我想在文本框(GUI 面板)中显示主板序列号。我创建了一个文本框和动作按钮。我在动作按钮中编写了这段代码。我在这段代码中犯了什么错误?
try {
        Process p = Runtime.getRuntime().exec("wmic baseboard get serialnumber");
        BufferedReader inn = new BufferedReader(new InputStreamReader(p.getInputStream()));

        while (true) {

            String line = inn.readLine();
            if (line == null) {
                break;
            }
            motherboard.setText(line);
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(this, "Sorry could not found motherboard serial!");
    }

你不应忽略异常。至少将其写入日志中。在这种情况下,它会告诉你错误的原因。 - blafasel
可能是获取操作系统级别的系统信息的重复问题。 - vzamanillo
它无法告诉我什么是异常。当我在控制台中运行它时,它工作正常,但每当我尝试在GUI中运行它时,它不起作用,并且不显示在jTextfield中。 - Alamin Dawan
我认为从命令行工具获取输出并解析信息是垃圾。使用能够从Java查询WMI的库来代替。 - Marged
5个回答

3
 try
    {
        String result = null;
        Process p = Runtime.getRuntime().exec("wmic baseboard get serialnumber");
        BufferedReader input
                = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = input.readLine()) != null)
        {
            result += line;
        }
        if (result.equalsIgnoreCase(" ")) {
            System.out.println("Result is empty");
        } else
        {
            motherboard.setText(result);
        }
        input.close();
    } catch (IOException ex)
    {
        Exceptions.printStackTrace(ex);
    }

2
    getBufferReader("wmic logicaldisk get volumeserialnumber");
    getBufferReader("wmic csproduct get UUID");
    getBufferReader("wmic csproduct get name");
    getBufferReader("wmic CPU get ProcessorId");
    getBufferReader("wmic CPU get Architecture");
    getBufferReader("wmic CPU get NumberOfCores");
    getBufferReader("wmic CPU get ProcessorType");
    getBufferReader("wmic CPU get Revision");
    getBufferReader("wmic CPU get Family");
    getBufferReader("wmic CPU get Level");
    getBufferReader("wmic CPU get Name");
    getBufferReader("wmic CPU get SerialNumber");
    getBufferReader("wmic bios get Manufacturer");
    getBufferReader("wmic bios get Version");
    getBufferReader("wmic bios get SMBIOSBIOSVersion");
    getBufferReader("wmic bios get SMBIOSMajorVersion");
    getBufferReader("wmic bios get SMBIOSMinorVersion");
    getBufferReader("wmic bios get ReleaseDate");
    getBufferReader("wmic bios get serialnumber");
    getBufferReader("wmic baseboard get serialnumber");
    getBufferReader("wmic DISKDRIVE get SerialNumber");
    getBufferReader("wmic useraccount get name,sid");


    public static String getBufferReader(String getCode) throws IOException, Exception {
        StringBuilder output = new StringBuilder();
        Process processRun = Runtime.getRuntime().exec(getCode);
        BufferedReader processBuf = new BufferedReader(new InputStreamReader(processRun.getInputStream()));
        String line;
        while ((line = processBuf.readLine()) != null) {
            output.append(line).append("\n");
        }
        return output.toString().substring(output.indexOf("\n"), output.length()).trim().replace("-", "");
    }

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

1
问题在于您读取了一个多行输出。
while (true) {
    String line = inn.readLine();
    if (line == null) {
            break;
        }
...

但是你总是只在文本框中存储当前读取的行。这意味着先前的输出被覆盖了。
...
        motherboard.setText(line);
}

作为输出的最后一行是一个“空行”,所以您的文本字段显示这个“空行”(意味着您看不到任何输出)。
编辑:下面仅为完整性添加。
一个小方法可以用作“String serialNumber = getSerialNumber()”。它过滤掉标题行和空行。
static String getSerialNumber() throws IOException, InterruptedException {
    ProcessBuilder pb = new ProcessBuilder("wmic", "baseboard", 
            "get", "serialnumber");
    Process process = pb.start();
    process.waitFor();
    String serialNumber = "";
    try (BufferedReader br = new BufferedReader(new InputStreamReader(
            process.getInputStream()))) {
        for (String line = br.readLine(); line != null; line = br.readLine()) {
            if (line.length() < 1 || line.startsWith("SerialNumber")) {
                continue;
            }
            serialNumber = line;
            break;
        }
    }
    return serialNumber;
}

另一种方法是在wmic命令上进行过滤,并仅读取输出的第一行。可以使用Windows提供的命令行工具。
wmic baseboard get serialnumber | findstr /r /v "^$" | findstr /v "SerialNumber"

或者使用自定义的XSL来控制wmic的输出。
将其保存为simple.xsl。
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="/"><xsl:apply-templates select="COMMAND/RESULTS"/>
</xsl:template>
</xsl:stylesheet>

并运行以下命令:

wmic baseboard get serialnumber /Format:.\simple

1
private void serial(){
    // wmic command for diskdrive id: wmic DISKDRIVE GET SerialNumber
    // wmic command for cpu id : wmic cpu get ProcessorId
    Process process = null;
    try {
        process = Runtime.getRuntime().exec(new String[] { "wmic", "bios", "get", "SerialNumber" });
        //process = Runtime.getRuntime().exec(new String[] { "wmic", "DISKDRIVE", "get", "SerialNumber" });
       // process = Runtime.getRuntime().exec(new String[] { "wmic", "cpu", "get", "ProcessorId" });
       //process = Runtime.getRuntime().exec(new String[] { "wmic", "baseboard", "get", "SerialNumber" });
        process.getOutputStream().close();
    } catch (IOException ex) {
        Logger.getLogger(Activate.class.getName()).log(Level.SEVERE, null, ex);
    }
    Scanner sc = new Scanner(process.getInputStream());
    String property = sc.next();
    String serial = sc.next();
    System.out.println(property + ": " + serial);
    this.serial.setText(property + ": " + serial);
}

对于主板编号,请使用“baseboard”。 - Victor Irechukwu
请问您能否添加一个解释,说明为什么这是一个解决方案。 - Jim
@IronMonkey 你可以使用Scanner类作为读取进程输入流的另一种替代方式,而不是BufferedReader。虽然我从未尝试过使用BufferedReader,但Scanner对我来说完成了工作。 - Victor Irechukwu

0

你应该使用另一种形式的 Runtime.exec:

        String[] command = {"wmic", "baseboard", "get", "serial number"};
        Process p = Runtime.getRuntime().exec(command);

通常情况下,当您使用参数调用外部命令时,exec(String) 方法可能无法按预期工作。在这些情况下,exec(String[]) 版本更加可靠。 - Xvolks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接