2010-01-27 70 views
17

我有一些文件:转换一个Ant文件集到多个应用ARGS

dir/foo.txt 
dir/bar.txt 
dir/foobar.txt 

在Ant apply任务,我想通过文件的列表作为参数:

<target name="atask"> 
    <apply executable="${cmd}" parallel="false" verbose="true"> 
     <arg value="-in"/> 
     <srcfile/> 
     <arg value="dir/foo.txt"/> 
     <arg value="dir/bar.txt"/> 
     <arg value="dir/foobar.txt"/> 

     <fileset dir="${list.dir}" includes="*.list"/> 
    </apply> 
</target> 

这工作正常,但如果我想选择的文件列表中动态地使用文件集:

<fileset dir="dir" includes="*.txt"/> 

我怎样才能转换此文件集到arg元素 - 每个文件一个?喜欢的东西:

<arg> 
    <fileset dir="dir" includes="*.txt"/> 
</arg> 

,而不是

<arg value="dir/foo.txt"/> 
<arg value="dir/bar.txt"/> 
<arg value="dir/foobar.txt"/> 

(这个例子不工作,因为ARG不支持文件集

回答

26

这里的说明中使用的实例的pathconvert任务。

使用<arg line />将转换后的路径传递给可执行文件。

这假设您的*.txt文件的路径中没有空格。

<target name="atask"> 
    <fileset dir="dir" id="myTxts"> 
     <include name="*.txt" /> 
    </fileset> 
    <pathconvert property="cmdTxts" refid="myTxts" pathsep=" " /> 

    <apply executable="${cmd}" parallel="false" verbose="true"> 
     <arg value="-in" /> 
     <srcfile /> 
     <arg line="${cmdTxts}" /> 

     <fileset dir="${list.dir}" includes="*.list" /> 
    </apply> 
</target> 

如果你可能会遇到空间这应该做到:同上,但改变(有望明显这线):

<pathconvert property="cmdTxts" refid="myTxts" pathsep="' '" /> 

 <arg line="'${cmdTxts}'"/> 
+0

我认为这是不可能的混合,但它似乎是好的。这是一个很好的解决方法,它的工作原理(我没有用名称中的空格测试过这种情况)。 – Jmini 2010-01-28 17:47:52

+0

经过测试并为我工作。 – ViToni 2015-09-04 19:51:12