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

16

我正在尝试使用 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个回答

10

以下是代码:

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

官方 NAnt 文档中关于 <loadfile> 元素的内容包含了你所需的确切示例。请查看页面底部。


6
这对我几乎有效,缺少的是将文件回显以替换旧文件——https://dev59.com/DEbRa4cB1Zd3GeqPzl-e。 - shanabus

9
这是我做的方法。
<loadfile file="${file}" property="file.content">
    <filterchain>
        <replacestring from="StringToMatch" to="StringToReplace" ignorecase="true" />
    </filterchain>
</loadfile>
<echo file="${file}">${file.content}</echo>

3

所以你想修改一个XML格式的.wxs文件,是吗?

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


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 /> 元素中。

1

我从来没有成功地使用过filterchain和replacetokens。最终我使用了这个方法,它非常好用。

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

1
所有这些答案都对我没有用,也许因为我需要替换一个包含空格的字符串。使用filterchain / replacetokens加载文件内容对关联属性的内容没有任何影响。也许我使用方法不正确。
@Ally和@John Sterne建议的任务“replacestring”和“replacetext”不存在。
它被包含在Jenkins构建过程中,因此必须将ENVIRONMENT变量设置为工作目录。
    <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>

1
今天我遇到了这个问题。为了解决它,我使用了move命令而不是loadfile或copy。这对我有用,因为我的文件很小。另一个需要注意的是,replacetokens需要标记的开始标识符和结束标识符;分别是begintoken和endtoken。如果没有设置它们,默认值为@符号。因此,如果您想替换MY_SERVER_PLACE_HOLDER这样的值,那么您文件中的值必须是@MY_SERVER_PLACE_HOLDER@。如果您想让您的标记以其他方式开头,则应指定begintoken和endtoken值。这应该能让您了解到开始标记和结束标记会带来的问题。
以下是我做的简要步骤:
1.将文件移动到临时位置。在此过程中,我使用了filterchain和removetokens来更改文件中的值。
2.在第二步中,我将文件移回其原始位置。
3.然后,我使用delete命令删除我创建的临时文件夹。
以下是我所做的(可能不是语法正确,因为我此时不在代码面前)。
    <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" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接