我要做的是找到一个带有NAnt的文件。此文件可以位于给定文件夹的目录结构中的任何位置。
我尝试使用NAnt-foreach任务(这可行),但我不太相信:
<target name="find-file">
<fail message="Property param.dir must be set" unless="${property::exists('param.dir')}" />
<fail message="Property param.pattern must be set" unless="${property::exists('param.pattern')}" />
<property name="return.file" value="" />
<foreach item="File" property="iterator.file">
<in>
<items>
<include name="${param.dir}\**\${param.pattern}" />
</items>
</in>
<do>
<property name="return.file" value="${iterator.file}" if="${string::get-length(return.file) == 0}" />
</do>
</foreach>
</target>
有没有人知道更好的方法?如果不是,我怎样才能在找到第一个元素后退出foreach循环?
答案 0 :(得分:4)
This nantcontrib function will put the matching filenames into a delimited string.
如果你知道只有一个匹配的文件存在,那么它可能会得到你想要的。如果有多个,那么你可以使用nant substring函数通过将子字符串带到第一个分隔符来获得第一个匹配。
以下nant脚本:
<?xml version="1.0" encoding="utf-8"?>
<project default="find-file2">
<property name="NantContrib.dir" value="C:\Program Files\nantcontrib-0.85\" readonly="true" />
<target name="LoadNantContrib">
<loadtasks assembly="${NantContrib.dir}bin\NAnt.Contrib.Tasks.dll" />
</target>
<target name="find-file2" depends="LoadNantContrib">
<fileset id="find.set">
<include name="${param.dir}\**\${param.pattern}" />
</fileset>
<property name="return.file" value="${fileset::to-string('find.set', ' | ')}" />
<echo message="return.file=${return.file}"/>
<echo message="Found ${fileset::get-file-count('find.set')} files"/>
</target>
</project>
...以及以下文件夹结构:
\---folderroot
+---folder1
| dontfindme.txt
| findme.txt
|
+---folder2
| dontfindme.txt
|
\---folderempty
......按预期工作。搜索findme.txt会找到一个文件。搜索dontfindme.txt会找到两个文件。搜索* .txt会找到三个文件。
示例电话:
nant -D:param.dir=folderroot -D:param.pattern=findme.txt
示例输出:
find-file2:
[echo] return.file=C:\Documents and Settings\rbaker\My Documents\nantfindfile\folderroot\folder1\findme.txt
[echo] Found 1 files
BUILD SUCCEEDED