Pregunta

Estoy teniendo algunos problemas con conseguir el .getruntime.exec () funcione correctamente. Aquí está el código que trata con esa parte:

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();
}

Se imprime el comando, ya que debe mirar. Cuando ejecuto el programa aquí es la salida:

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)
¿Fue útil?

Solución

Está intentando ejecutar un comando shell sin la cáscara.

Es decir, usted está tratando de ejecutar algo que una cáscara interpretaría (específicamente el '|' tubería y anexar '>>'). Para solucionar esto, tiene Java ejecutar una instancia de concha y pasar todo el comando de la cáscara. ¿Cómo funcionaría esto depende de la plataforma.

Por ejemplo, en Linux:

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

O en Windows:

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

Otros consejos

Las redirecciones y las tuberías no funcionan - no son una parte del comando, sino que se basan en la cáscara que subyace a ser evaluados cuando se ejecuta esta línea de correo. sol. una ventana cmd.exe.

Usted tendrá que utilizar los flujos de entrada y salida del objeto del proceso se obtiene a partir del método exec ().

Si su principal preocupación es para consultar Active Directory, no se utiliza la herramienta de consulta específico que nos ocupa, se debe considerar ir a una solución todo en Java. Hay varias maneras de acceder a los directorios LDAP (Active Directory que también lo es), por ejemplo aquí:

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

No he utilizado yo mismo, sin embargo, sin embargo, no parece estar abandonado, ya que hay liberaciones a partir de 2008.

Creo que la "append" (>>) y el "tubo" (|) no están permitidos.

Se podía probarlo, dando a cada elemento de un lugar en la matriz:

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

y ver qué pasa.

Como otros han señalado, no se puede realizar la redirección de stdout / err a través de las instrucciones de la cáscara, ya que no tiene una concha.

Se necesita consumir stdout / stderr en hilos separados, para evitar el bloqueo. Ver esta respuesta para más información.

En el final (y sí, esto fue un poco de una manera rápida y sucia) que terminé llamando a un archivo .bat que ejecute el comando y utiliza las tuberías y redirecciones. Estoy seguro de que no es la mejor solución, pero funciona para lo que necesito.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top