2010-11-04 44 views
2

我在做的是找到一個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循環?

回答

4

This nantcontrib function will put the matching filenames into a delimited string.

如果你知道只有一個匹配文件存在,那麼它可能會得到你想要的。如果有幾個,則可以使用nant substring函數通過將子串取到第一個分隔符來獲得第一個匹配。

下惡性腳本:

<?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 
+0

的惡性的contrib功能文件集::對字符串將不工作,除非有一種方法可以動態地在運行時創建的文件集(我不知道這些文件)。我的代碼會得到第一個找到的文件,但我的問題是如何終止循環。 – Dennis 2010-11-23 09:24:33

+0

用示例更新。完美的作品。您提出了一種儘早終止循環的方法:我沒有看到一個。你還要求更好的方法。這是否是更好的問題值得商榷 - 這當然是一個可行的選擇。 – robaker 2010-11-23 11:51:58

+0

如果有多個文件匹配,它不會工作。 – Wernight 2011-10-26 12:27:09