2017-10-13 2 views
0

Java 프로그램에서 cmd를 실행할 수있는 명령을 실행하고 싶습니다. 약간의 연구를 한 후에, 나는 이것을 할 방법을 찾았다 고 생각했습니다. 그러나, 내 코드가 작동하지 않습니다.Java 터미널에서 실행할 수있는 명령을 실행하는 방법

내 코드는 프로그램이 실행되지만 출력을 생성하지

import java.io.*; 

public class CmdTest { 
    public static void main(String[] args) throws Exception { 
     String[] command = {"ag","startTimes conf.js >> pro.txt"}; 
     ProcessBuilder builder = new ProcessBuilder(command); 
     builder.directory(new File("./test-java/")); 
     Process p = builder.start(); 
    } 
} 

이다. "ls -a"와 같은 다른 명령을 사용해 보았지만 여전히 출력이 없습니다.

누구든지 디버깅하거나 더 좋은 방법을 제안 할 수 있습니까? 고마워요

편집 1 : 저는 이것을 Mac에서 실행하고 있습니다. 디버깅에 필요한 경우

편집 2 : 일반적인 ls 및 다른 명령은 사용자가 제공 한 솔루션을 사용하고 있습니다. 그러나 Java 프로그램에서 ag (the_silver_searcher) 명령을 사용하려고합니다. ProcessBuilder이 있지만

Exception in thread "main" java.io.IOException: Cannot run program "ag startTimes conf.js >> pro.txt": error=2, No such file or directory 
+0

Windows 또는 Linux 환경에서 실행 중이십니까? –

+0

@AustinA, Mac에서 실행 중 – Sid

답변

0

기존 답변은 코드에서 문제를 해결하는 방법에 대한 정보를 제공하지만 코드가 작동하지 않는 이유를 제공하지 않습니다.

셸에서 프로그램을 실행하면 프로그램이 실행되기 전에 셸에서 처리 한 내용이 상당합니다. 명령 줄

String[] command = {"ag","startTimes conf.js >> pro.txt"}; 
    ProcessBuilder builder = new ProcessBuilder(command); 

명령 ag단일 인수 startTimes conf.js >> pro.txt 실행한다고 가정 - 가장 가능성이 당신이 원하는하지 무슨.한 단계 더 나아가 자. 무엇을 썼 으면

String[] command = {"ag","startTimes", "conf.js", ">>", "pro.txt"}; 
    ProcessBuilder builder = new ProcessBuilder(command); 

?

이것을 ag 명령의 출력을 리디렉션 할 >> 매개 변수에 대해 알고 있다고 가정 것 - 쉘이 활동하기 시작하는 곳과 여기에 다음 >> 운영자가 무엇을 할이야기, 쉘에 명령 입니다 프로세스의 표준 출력으로부터의 출력. ag 프로세스는 셸에서 시작할 때 절대로이 리디렉션을 알지 못하며 >>과 대상 파일 이름에 대한 단서가 전혀 없습니다.

이 정보를 사용하여 다른 답변의 코드 샘플 만 사용하면됩니다. 나는 그들에게 나의 귀속을 위해 그들을 복사하지 않을 것이다.

+0

올라프 (Olaf)에게 정말 감사드립니다. 마침내 문제를 해결할 수있었습니다. – Sid

0

이, 난 항상 그것은 당신이 입력과 출력을 얻을 수있는 Process을 반환

Runtime.getRuntime().exec("cmd");

Process Runtime.exec(String) 사용했습니다 - 내가 그 때, 나는 다음과 같은 오류가 발생합니다

의 스트림

ProcessBuilder 인 경우에도 Process.get<Input/Output/Error>Stream()

0에 액세스 할 수 있어야합니다. ,

try (BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())) { 
    System.out.println(reader.readLine()); // process the output stream somehow 
} 

또한 당신이 나는 종종 별도의 스트림에서 수행 한 오류 스트림 (p.getErrorStream())를 읽을 수 있습니다

+0

"메인"java.io.IOException 예외 : "ag startTimes conf.js >> pro.txt"프로그램을 실행할 수 없습니다 : error = 2, No 그러한 파일 또는 디렉토리 ". 내가 뭐라고 제안 하나? – Sid

+0

@Sid 전체 파일 경로를 넣으려고하면 로컬 디렉토리의 명령을 실행했을 가능성이 있습니다 – phflack

0

당신이 과정에서 입력 스트림을 열어 프로세스의 출력을 읽을 필요 Java 8에서는 ProcessBuilderredirectErrorStream(true)을 사용하여 오류 스트림을 입력 스트림에 자동으로 추가 할 수 있습니다. 당연히 입력이 오는 스트림에서 더 이상 구별 할 수 없지만 읽기가 쉬워집니다. 입력 또는 오류 스트림을 읽지 않고 프로세스의 버퍼가 가득 차게되면 프로세스는 버퍼에 충분한 공간이 다시 생길 때까지 일시 중지하는 경향이 있습니다.

+0

"메인"java.io.IOException 스레드에서 예외가 발생했습니다 : "ag startTimes conf.js >> pro. txt ": error = 2, No such file or directory"를 선택하십시오. 내가 뭐라고 제안 하나? – Sid

0

또한 콘솔에 출력을 리디렉션 시작 방법 전에

builder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 

를 추가 할 수 있습니다.

+0

안녕하세요 벤, 당신의 솔루션은 내가 같은 명령을 사용할 때 작동합니다. 하지만 내가 ag 명령을 사용할 때 오류가 발생합니다. - "main"스레드의 예외 java.io.IOException : "ag startTimes conf.js >> pro.txt"프로그램을 실행할 수 없습니다 : 오류 = 2, 해당 파일 없음 또는 디렉토리 – Sid

+0

지금 무엇을 할 수 있습니까? – Sid

+1

새로운 질문을하고 있습니다. 두 가지 해결책 중 하나를 받아 들여 새로운 SO 문제를 게시하는 것이 타당합니다. –

0
//"ls" command runs under the "sh" on linux(cmd.exe on windows), so first arg is "sh"  
//second arg "-c" tells "sh" which exact command should be executed 
//"ls" is actual command 
//"startTimes" as I understand is a file or directory, it is arg for "ls" command 
//"conf.js" is second arg for "ls" command 
new ProcessBuilder("sh", "-c", "ls", "startTimes", "conf.js") 
//set working dir for "sh" process" 
      .directory(new File("./test-java/")) 
//output will be written to "pro.txt" in working dir of "sh" process 
      .redirectOutput(new File("./test-java/pro.txt")) 
      .start(); 
+1

[좋은 답변 작성 방법] (https://stackoverflow.com/help/how-to-answer)을 검토하십시오. 코드 전용 답변은 질문에서 문제를 해결하는 방법을 설명하지 않기 때문에 권장하지 않습니다. 당신은 이것이 무엇을하는지, 그리고 그것이 어떻게 문제를 해결 하는지를 설명하기 위해 답을 업데이트해야합니다. – FluffyKitten

관련 문제