如何使用NANT替换文件中的字符串?

时间:2011-12-19 15:17:38

标签: nant

我正在尝试使用Nant替换wxs文件中字符串的出现。

我只找到了以下使用<replaceString>的示例,但似乎它只能在复制的文件中使用。有没有其他方法可以替换字符串,而不实际复制文件?

<property name="NOW" value="${datetime::now()}" />
<copy todir="out">
    <fileset basedir="in">
        <include name="**/*" />
    </fileset>
    <filterchain>
        <replacetokens>
            <token key="NOW" value="${TODAY}" />
        </replacetokens>
        <tabstospaces />
    </filterchain>
</copy>

7 个答案:

答案 0 :(得分:8)

以下是代码:

<loadfile file="token.txt" property="token-file">
    <filterchain>
        <replacetokens>
            <token key="NOW" value="${datetime::now()}" />
        </replacetokens>
    </filterchain>
</loadfile>

<loadfile>元素的官方NAnt文档包含the exact sample you need。请参见页面底部。

答案 1 :(得分:7)

我是这样做的。

<loadfile file="${file}" property="file.content">
    <filterchain>
        <replacestring from="StringToMatch" to="StringToReplace" ignorecase="true" />
    </filterchain>
</loadfile>
<echo file="${file}">${file.content}</echo>

答案 2 :(得分:3)

所以你试图修改一个XML的.wxs文件,对吗?

在这种特殊情况下,如果能够通过XPath确定要替换的字符串的位置,则可以使用<xmlpoke>

答案 3 :(得分:2)

我在这里找到了一个解决方案:http://frank.overseakids.com/?p=182

<loadfile file=”${dir.template}\template.db_name.sql” property=”restore.db.sql.db_name”>
<filterchain>
<replacetokens>
<!– this looks for tokens like @blah.blah@ in the file being loaded and replaces them–>
<token key=”restore.db.prefix” value=”${restore.db.prefix}” />
<token key=”backup.file.path” value=”${backup.file.path}” />
</replacetokens>
</filterchain>
</loadfile>
<property name=”current.db” value=”db_name” />
<property name=”current.log” value=”${dir.log}\${restore.db.logfile.prefix}_db_name.log” />
<property name=”current.file” value=”${dir.template}\restore.db_name.tmp.sql” />
<delete if=”${file::exists(current.file)}” file=”${current.file}” />
<echo file=”${current.file}”>${restore.db.sql.db_name}</echo>

您可以将其包装在<foreach />元素中。

答案 4 :(得分:1)

我从未设法让filterchain和replacetokens正常工作。我最终使用了它并且效果很好。

<replacetext filename="${filename}" src="stringToBeReplaced" replacement="replacementString" />

答案 5 :(得分:1)

所有这些答案对我都不起作用,可能是因为我需要用空格替换字符串。使用filterchain / replacetokens加载文件内容对关联属性的内容没有任何作用。也许我用错了。
@Ally和@John Sterne建议的任务“replacestring”和“replacetext”不存在。

它包含在Jenkins构建过程中,因此环境变量必须设置为工作目录。

    <loadfile file="./my/batch.bat" property="file.content" />
    <property name="file.content"
              value="${string::replace(file.content, 'D:\path to\the working\space', environment::get-variable('WORKSPACE'))}" />
    <property name="file.content"
              value="${string::replace(file.content, 'Cd C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin', 'CD /D C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin')}" />
    <echo file="./my/batch.bat">${file.content}</echo>

答案 6 :(得分:1)

我今天遇到了这个问题。为了解决这个问题,我使用了move命令而不是loadfile或copy。这对我有用,因为我的文件非常小。另一个需要注意的是,replacetokens需要一个起始标识符和令牌的结束标识符;分别是begintoken和endtoke。如果未设置,则默认值为@符号。因此,如果要替换MY_SERVER_PLACE_HOLDER等值,则表示文件中的值必须为@ MY_SERVER_PLACE_HOLDER @。如果您希望令牌以不同的东西开头,则应指定begintoken和endtoken值。这应该可以让你了解开始令牌和结尾会给你带来的问题。

所以这就是我简单的做法

  1. 将文件移至临时位置。我用过那个动作 filterchain with removetokens来更改文件中的值。
  2. 在第2步中,我将文件移回原来的位置。
  3. 然后我使用delete命令删除我创建的临时文件夹。
  4. 这是我做的。 (可能在语法上不正确,因为我现在不在代码前面)

        <move todir="temp">
           <fileset basedir="in">
             <include name="myfile.dat" />
           </fileset>
           <filterchain>
              <replacetokens>
                 <token key="MY_SERVER_PLACE_HOLDER" value="http://www.someserver.com" />
              </replacetokens>
              <tabstospaces />
          </filterchain>
        </move>
        <move todir="in">
           <fileset basedir="temp">
               <include name="myfile.dat" />
           </fileset>
        </move>
        <delete dir="temp" />