Java Runtime.getRuntime () Argumento Ilegal Excepción
-
13-09-2019 - |
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)
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.