Сохранять результат команды cmd выполненный с java в переменной

Возможно хранить результат выполнения команды с java в переменной типа string? Я это попробовал таким образом, но вывод stdInput.readLine () - всегда NULL, я что-то врежу. Другой вопрос, - если возможно прилагать результат выполнения command1, как я это делаю в command2, ввожу переменную посередине string команды? Код - следующий:

    public class PDOFinder{

    //PdoFinder constructor
    public PDOFinder(){
    }

    //variables to store device data
    static String webcamPDOName = null;
    static String webcamDeviceID = null;

    public static void main(String[] args) throws IOException{

        try{

            String output = null;
            String output2 = null;

            String[] command = new String[3];
            command[0] = "cmd.exe";
            command[1] = "/c";
            command[2] = "C:\\Users\\user1\\Desktop\\devcon.exe find =image | findstr USB\\VID*";

            Process process1 = Runtime.getRuntime().exec(command);

            InputStreamReader input = new InputStreamReader(process1.getInputStream());
            BufferedReader stdInput = new BufferedReader(input);

            System.out.println("salidaaa: "+stdInput.readLine());

            if((output=stdInput.readLine()) != null){
                webcamDeviceID = stdInput.readLine();
            }

            System.out.println(webcamDeviceID);

            String[] command2 = new String[3];
            command2[0] = "cmd.exe";
            command2[1] = "/c";
            command2[2] = "wmic path Win32_PnPSignedDriver where 'deviceid="+webcamDeviceID+"' get pdo";

            Process process2 = Runtime.getRuntime().exec(command2);
            InputStreamReader input2 = new InputStreamReader(process2.getInputStream());
            BufferedReader stdInput2 = new BufferedReader(input2);

            if((output2=stdInput2.readLine()) != null){
                webcamPDOName = stdInput2.readLine();
            }

            System.out.println(webcamPDOName);
        }
        catch(Exception e){
            System.out.println("Exception: "+e);
            e.printStackTrace();
        }
    }
}
4
задан 26.01.2017, 20:46
0 ответов

Используя ProcessBuilder ты можешь соединять stdout и stderr твоего процесса. Метод waitFor() блокируй выполнение и жди до тех пор, пока процесс не заканчивается, потом возвращая результат (обычно 0 в случае нормального завершения o> =1 в случае ошибки).

Ты можешь использовать этот класс, чтобы упрощать жизнь:

/**
 * @author snolde
 *
 */
public class ProcToString {


    private ProcessBuilder pb;
    private String out=null;
    private Process proc=null;

    public ProcToString(String... cmd){
        pb = new ProcessBuilder(cmd);
        // redirigir stdErr>stdOut
        pb.redirectErrorStream(true);
    }

    // espera a que el proceso termina y devuelve el estado
    public int runProcess() throws IOException, InterruptedException{
        proc = pb.start();
        new Stream().start();
        return proc.waitFor();
    }

    // el proceso tiene resultado?
    public boolean hasResult(){
        return !proc.isAlive() && out!=null;
    }

    //devuelve resultado o null
    public String getResult(){
        return out;
    }

    final class Stream extends Thread{

        @Override
        public void run() {
            StringBuilder sb=new StringBuilder();
            String line;
            BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            try {
                while((line = br.readLine())!=null){
                    sb.append(line).append("\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                out=sb.toString();
            }
        }
    }

}

ты можешь использовать это в этом способе:

        ProcToString pts=new ProcToString("cmd.exe", "/C", "dir");
        try {
            System.out.println(pts.runProcess());
            if (pts.hasResult()){
                // aquí viene tu resultado
                String resultado = pts.getResult();
                System.out.println(resultado);
            }
        } catch (IOException | InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
1
ответ дан 03.12.2019, 17:29

Изменись getInputStream из-за getErrorStream таким образом:

InputStreamReader input = new InputStreamReader(process1.getErrorStream());

Если он возвращает правильную стоимость, если ты можешь прилагать это в следующей команде.

0
ответ дан 03.12.2019, 17:29
  • 1
    Та же удача, возврати null... –  26.01.2017, 22:12
  • 2
    После того, как скроллировали твой có я говорю в моем ПК с изменением, что я говорю тебе, у меня выходит это: salidaaa: Система не может находить определенный маршрут. null –  26.01.2017, 22:30
  • 3
    Потому что маршрут, который ты размещаешь, не существует. ¿ Команда, которую ты используешь с маршрутом, правильна? –  26.01.2017, 22:31
  • 4
    Если просвет, у меня есть программа прямо на рабочем столе, у меня есть другой класс, который выполняет программу на рабочем столе, это тот же маршрут, и функционирует, я не понимаю, что он происходит с этим, но сейчас вижу, что также он не переворачивает данных в текстовом файле с java, хотя, если он это делает, если я делаю это онлайновым команд, используя ту же команду... Это очень редкое –  26.01.2017, 22:36
  • 5
    Я думаю, что это проблема devcon.exe и не кода –  26.01.2017, 22:40