2010-12-03 6 views
19
<target name="CheckState"> 
    <exec executable="${App.path}"/> 
</target> 

En esta tarea, la aplicación ejecutable devolverá un valor int que indicará el estado de mi aplicación. ¿Cómo podría obtener el devueltos en valor en escritura hormiga, voy a utilizar este valor para determinar algunos comportamientosCómo obtener un valor de retorno de un comando ejecutivo en el script ant

Gracias de antemano

Respuesta

28

Uso los resultproperty y failonerror atributos de la tarea exec, por ejemplo:

<target name="CheckState"> 
    <exec executable="${App.path}" 
      resultproperty="App.state" 
      failonerror="false"/> 
    <echo message="App state was: ${App.state}" /> 
</target> 

citando de los documentos de trabajo execerrores y devolver códigos:

De forma predeterminada, se ignora el código de retorno de un exec ; cuando establece failonerror = "true", cualquier devolución fallo de señalización del código (OS específico) hace que la compilación falle. Alternativamente, puede establecer resultproperty al nombre de una propiedad y asignarlo al código de resultado (excepto la inmutabilidad, del curso ).

Si el intento de iniciar el programa falla con un código de error depende del sistema operativo, luego se detiene la acumulación a menos failifexecutionfails se establece en false. Puede usarlo para ejecutar un programa si existe, pero no haga nada.

¿Qué significan esos códigos de error? Bueno, son dependientes del sistema operativo. En los cuadros de Windows , debe consultar la documentación ; el código de error 2 significa 'no tal programa', lo que generalmente significa que no está en la ruta. Cada vez que vea un error de este tipo en cualquier tarea Ant, es , generalmente no es un error Ant, pero tiene un problema de configuración en su máquina.

+1

Gracias. ¡Esto funciona! Intenté outputproperty y errorproperty, pero no vi resultproperty. – Hyden

+0

¿Tenía la propiedad de la horquilla establecida en verdadero? Según O'Reilly's _Ant: The Definitive Guide_, la propiedad resultante solo funcionará si failonerror es falso _y_ fork es verdadero. Sin embargo, fork parece ser un atributo del elemento Java. –

+1

@Jamil No lo entiendo del todo. Un fork está implícito en un ejecutivo: no hay necesidad de especificarlo. –

6

Aquí es una forma genérica para comprobar el resultado y mostrar la salida de la ejecución solamente si el proceso devuelve un código de error.

<property 
    name="my.project.tmp.exec.output" 
    value="${tmp.dir}/exec-output.txt"/> 

<target 
    name="my.project.my.task"> 
    <exec 
     executable="${App.path}" 
     output="${my.project.tmp.exec.output}" 
     resultproperty="my.project.my.task.result" 
     failonerror="false"/> 
    <loadfile 
     srcfile="${my.project.tmp.exec.output}" 
     property="my.project.my.task.output" 
    /> 
    <fail message="ERROR: ${my.project.my.task.output}"> 
     <condition> 
      <not> 
       <equals arg1="${my.project.my.task.result}" arg2="0"/> 
      </not> 
     </condition> 
    </fail> 
    <delete file="${my.project.tmp.exec.output}"/> 
</target> 
Cuestiones relacionadas