簡體   English   中英

從 Powershell 讀取 output 需要很多時間來執行

[英]Reading output from Powershell takes much time to execute

所以,我在 java 上寫了這段代碼,它需要大約 6 秒的時間來執行並給出 output。因為我不是來自編碼背景,所以我期待這個專家組的人是否可以幫助我優化這一點。 下面是我的代碼,PowerShell 命令也在幾秒鍾內運行。 只有這個 while 循環需要很多時間。

我想要實現的只是獲取 HDD 驅動器列表並打印出來。

Process p = Runtime.getRuntime().exec("powershell.exe Get-Partition -disknumber 1 | select DriveLetter");
BufferedReader in = new BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
String line1 = "";
ArrayList<String> hddList = new ArrayList<String>();
while ((line1 = in.readLine()) != null) {
    if (!line1.trim().isEmpty()) {
        if (line1.contains("HDD")) {
            hddList.add(line1.replaceAll(" +", "#").split("#")[0]+"#"+"HDD");
        }
    }
}

正如我在評論中所說,我認為問題出在powerShell的執行上,而不是 Java。 使用cmd.exe查看以下運行速度。 在這里,我所做的只是列出目錄並替換<DIR>就好像它是 HDD 一樣。

        Process p = Runtime.getRuntime().exec(
                "cmd.exe /c dir".split("\\s+"));
                        
        System.out.println(p);
        BufferedReader in = new BufferedReader(
                new java.io.InputStreamReader(p.getInputStream()));
        String line1 = "";
        List<String> hddList = new ArrayList<String>();
        while ((line1 = in.readLine()) != null) {
            System.out.println(line1);
            if (!line1.trim().isEmpty()) {
                if (line1.contains("<DIR>")) {
                    hddList.add(line1.replaceAll(" +", "#").split("#")[0] + "#"
                            + "HDD");
                }

            }
        }
        System.out.println(hddList);

您可能能夠以管理員身份運行cmd.exe並使用相關的特權命令來獲取磁盤信息。 我還沒有確定如何在沒有密碼輸入的情況下做到這一點。

這似乎是一個xy 問題,因為您可以輕松地在 Java 中獲取驅動器號,例如

List<String> driveLetters = new ArrayList<>();
for(Path r: FileSystems.getDefault().getRootDirectories()) {
    String s = r.toString();
    if(s.length() == 3 && s.charAt(1) == ':') {
        driveLetters.add(s.substring(0, 1));
    }
}

從 Java 7 開始。這不需要進程間通信,因此沒有這樣的延遲問題。

如果你想將結果限制為固定硬盤,你可以使用類似

List<String> driveLetters = new ArrayList<>();
for(Path r: FileSystems.getDefault().getRootDirectories()) {
    String s = r.toString();
    if(s.length() == 3 && s.charAt(1) == ':') try {
        FileStore store = Files.getFileStore(r);
        if(!Boolean.TRUE.equals(store.getAttribute("volume:isRemovable"))
        && !Boolean.TRUE.equals(store.getAttribute("volume:isCdrom"))) {
            driveLetters.add(s.substring(0, 1));
        }
    }
    catch(IOException ex) {} // no media in drive, obviously not an HDD then
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM