문제

.getRuntime.exec ()를 제대로 작동시키기 위해 문제가 있습니다. 다음은 해당 부분을 다루는 코드입니다.

while (line != null)
{
  String name = line;
  String commandFull = commandFirst + name + commandLast;

  String[] fullCommand = new String[] {commandFirst, name, commandLast};
  for(int i=0;i<3;i++)
  {
    System.out.print(fullCommand[i]);
  }
  Runtime runner = Runtime.getRuntime();
  Process p = runner.exec(fullCommand);

  outFile.println(fullCommand);

  line = inFile.readLine();
}

그것은 명령을보아야한다. 프로그램을 실행할 때 여기에서 출력이 있습니다.

adfind -b dc=stuff,dc=com -f "cn=user" |find "displayName" >> fullList.txt
Exception in thread "main" java.lang.IllegalArgumentException
        at java.lang.ProcessImpl.<init>(Unknown Source)
        at java.lang.ProcessImpl.start(Unknown Source)
        at java.lang.ProcessBuilder.start(Unknown Source)
        at java.lang.Runtime.exec(Unknown Source)
        at java.lang.Runtime.exec(Unknown Source)
        at lookup.main(lookup.java:41)
도움이 되었습니까?

해결책

쉘없이 쉘 명령을 실행하려고합니다.

즉, 쉘이 해석 할 무언가를 실행하려고합니다 (특히 파이프 '|' 그리고 추가 '>>'). 이를 해결하려면 Java가 쉘 인스턴스를 실행하고 전체 명령을 쉘에 전달하도록하십시오. 이것이 어떻게 작동하는지는 플랫폼에 따라 다릅니다.

예를 들어 Linux에서 :

String fullCommand = {"/bin/sh", "-c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};

또는 Windows에서 :

String fullCommand = {"cmd.exe", "/c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};

다른 팁

리디렉션과 파이프는 작동하지 않습니다. 명령의 일부는 아니지만 예를 들어 CMD.exe 창 에서이 라인을 실행할 때 평가 될 기본 쉘에 의존합니다.

exec () 메소드에서 얻은 프로세스 개체의 입력 및 출력 스트림을 사용해야합니다.

주된 관심사가 특정 쿼리 도구를 사용하지 않고 Active Directory를 쿼리하는 것이라면 All-Java 솔루션을 고려해야합니다. 예를 들어 LDAP 디렉토리 (Active Directory도)에 액세스하는 방법에는 여러 가지가 있습니다.

http://developer.novell.com/wiki/index.php/jldap

나는 아직 그것을 스스로 사용하지 않았지만 2008 년부터 릴리스가 있기 때문에 버려지는 것처럼 보이지 않습니다.

"부록"(>>)과 "파이프"(|)는 허용되지 않는 것 같습니다.

각 항목을 배열의 장소에 제공하여 시도 할 수 있습니다.

String [] command = {"adfind" "-b" "dc=stuff,dc=com" "-f" "cn=user" "|" "find" "displayName" ">>" "fullList.tx" }

그리고 무슨 일이 일어나는지보십시오.

다른 사람들이 지적했듯이 쉘이 없기 때문에 쉘 지침을 통해 STDOUT/ERR 리디렉션을 수행 할 수 없습니다.

차단을 방지하려면 별도의 스레드로 stdout/stderr를 소비해야합니다. 보다 이 답변 자세한 내용은.

결국 (예, 이것은 약간 빠르고 더러운 방법이었습니다) 나는 명령을 실행하고 파이프와 리디렉션을 사용하는 .bat 파일을 호출하게되었습니다. 나는 그것이 최선의 솔루션이 아니라고 확신하지만 그것은 내가 필요한 것에 효과가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top