2010-01-27 3 views
14

Java에서 매개 변수를 필요로하는 배치 파일을 실행하는 데 문제가 있습니다. 이러한 매개 변수는 공백을 포함 할 수 있으므로 따옴표로 묶어야합니다. 일부 매개 변수에는 !과 같은 특수 문자가 포함될 수 있으므로 Linux에서도 동일한 작업을 수행해야합니다.매개 변수를 사용하여 실행

비 기능적 Windows 코드 :

ProcessBuilder pb = new ProcessBuilder(
     "cmd", 
     "/c", 
     "\"mybat.bat\"", 
     "\"param 1\"", 
     "\"param 2\"", 
     "\"param 3\"" 
     );  

비 기능적 리눅스 코드 :

ProcessBuilder pb = new ProcessBuilder(
     "bash", 
     "-c", 
     "'myshellscript.sh'", 
     "'param 1'", 
     "'param 2'", 
     "'param 3'" 
     ); 

내가, 내가 아래의 Windows 예제처럼 매개 변수를 추가해야 함을 이해하지만, 이것은하지 않습니다 공백 작업 :

ProcessBuilder pb = new ProcessBuilder(
     "cmd", 
     "/c", 
     "mybat.bat param 1 param 2 param 3" 
     ); 

어떻게해야합니까?

+0

당신이 그 정확한 이유에 대해 따옴표로 묶어하지 않았다? 마지막 스 니펫으로 왜 그걸하지 않니? – zneak

+0

처음 두 조각이 작동하도록 노력하고 있습니다. 세 번째 스 니펫은 mybat.bat에 6 개의 매개 변수를 전달하며, 세 개만 찾으면됩니다. –

답변

17

윈도우 :

ProcessBuilder pb = new ProcessBuilder(
     "cmd", "/c", "mybat.bat", 
     "param 1", "param 2", "param 3"); 

유닉스 :

ProcessBuilder pb = new ProcessBuilder(
     "sh", "mybat.sh", 
     "param 1", "param 2", "param 3"); 
+0

나는 이것을 시험해 보았다, 그것은 작동한다! !! –

+1

왜이 hapening입니까? java.io.IOException : java.io.IOException : sh : java.lang.UNIXProcess에서 sh :을 (를) 찾을 수 없습니다. DmMdbConsumer.migrateData (DmMdbConsumer.java:328)의 java.lang.ProcessImpl.start (ProcessImpl.java:65)에서 java.lang.ProcessBuilder.start (ProcessBuilder.java:451)의 (UNIXProcess.java:148) DmMdbConsumer.run (DmMdbConsumer.java:230) at java.lang.Thread.run (Thread.java : 595) –

+0

"sh"는 필자의 경우 "/ bin/sh"이어야합니다. 감사! –

5

아니요, 이 아니어야합니다. * nix의 args를 인용하십시오. 대화식 쉘에서 * nix에 대한 인용은 쉘이 잘못 해석하는 것을 막기 위해 필요하지만 직접 프로세스를 시작할 때 쉘이 관련되지 않습니다. 따라서 따옴표를 붙일 필요가 없습니다.

따옴표를 포함하면 시작한 프로세스가 들어오는 인수의 일부로이를 볼 수 있으며 따옴표가 포함 된 파일 이름을 열어보십시오.

"-c"인수도 bash에 넣기를 원하지 않습니다. 이것은 다음 인수를 명령 행으로 구문 분석하도록 지시하지만 인수 목록을 제공합니다. "-c"옵션과 여분의 따옴표를 제거하면 제대로 작동합니다.

적절한 리눅스 호출은 다음과 같습니다 또한

ProcessBuilder pb = new ProcessBuilder(
    "bash", 
    "myshellscript.sh", 
    "param 1", 
    "param 2", 
    "param 3" 
    ); 

하지 그 파일 "myshellscript.sh는"실행 가능하고 적절한 오두막 라인이있는 경우 (예를 들어 "#/빈/bash는!")을 "bash"인수가 필요하지 않습니다. 스크립트가 다른 언어로 작성된 스크립트로 대체되면 호출하는 응용 프로그램을 업데이트 할 필요가 없으므로 더 선호합니다.

마찬가지로 Windows에서는 "cmd"및 "/ c"인수가 필요하지 않습니다. 프로세스 시작 프로그램/OS는 자동으로 배치 파일 (확장명 기반) 실행을 처리해야합니다.

+0

불행히도 저는 cmd와/c가 필요합니다. 쉘 스크립트에는 셰번 (shebang) 라인이 있지만 쉘을 사용하거나 사용하지 않고 사용할 수는 없습니다. –

관련 문제