От ant manual basename: "When this task executes, it will set the specified property to the value of the last path element of the specified file"
Свойства После установки неизменны в ванильным муравья, поэтому при использовании задачи BASENAME в течение цикла, «имя» свойство имеет значение первого файла. Поэтому antcontrib вар задача с незадана = "истинный" должен быть использован:
<target name="store">
<for param="file">
<path>
<fileset dir="." includes="*.xqm"/>
</path>
<sequential>
<var name="name" unset="true"/>
<basename file="@{file}" property="name" />
<echo message="@{file}, ${name}"/>
</sequential>
</for>
</target>
В качестве альтернативы использовать local task, при использовании Ant 1.8.x или более поздней версии:
<target name="store">
<for param="file">
<path>
<fileset dir="." includes="*.xqm"/>
</path>
<sequential>
<local name="name"/>
<basename file="@{file}" property="name" />
<echo message="@{file}, ${name}"/>
</sequential>
</for>
</target>
Наконец, вы можете использовать вместо Ant Flaka из antcontrib:
<project xmlns:fl="antlib:it.haefelinger.flaka">
<fl:install-property-handler />
<fileset dir="." includes="*.xqm" id="foobar"/>
<!-- create real file objects and access their properties -->
<fl:for var="f" in="split('${toString:foobar}', ';')">
<echo>
#{ format('filename %s, last modified %tD, size %s bytes', f.tofile.toabs,f.tofile.mtime,f.tofile.size) }
</echo>
</fl:for>
<!-- simple echoing the basename -->
<fl:for var="f" in="split('${toString:foobar}', ';')">
<echo>#{f}</echo>
</fl:for>
</project>
См. Также: http://stackoverflow.com/questions/15245283/loop-through-directory-structure-in-ant/15258254#15258254 –