【问题标题】:How to replace string in a file using NANT?如何使用 NANT 替换文件中的字符串?
【发布时间】:2011-12-19 15:17:37
【问题描述】:

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

【问题讨论】:

    标签: nant


    【解决方案1】:

    代码如下:

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

    &lt;loadfile&gt; 元素的官方 NAnt 文档包含 the exact sample you need。请参阅页面底部。

    【讨论】:

    【解决方案2】:

    我是这样做的。

    <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 确定要替换的字符串的位置,则可以使用 &lt;xmlpoke&gt;

      【讨论】:

        【解决方案4】:

        我在这里为您找到了解决方案: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>
        

        您可以将其包装在 &lt;foreach /&gt; 元素中。

        【讨论】:

          【解决方案5】:

          我从未设法让过滤器链和替换令牌正常工作。我最终使用了它,效果很好。

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

          【讨论】:

            【解决方案6】:

            所有这些答案都对我不起作用,可能是因为我需要用其中的空格替换字符串。使用 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>
            

            【讨论】:

              【解决方案7】:

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

              简而言之,这就是我所做的

              1. 将文件移至临时位置。在那个动作中,我使用了 带有 removetokens 的过滤链来更改文件中的值。
              2. 在第 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" />
              

              【讨论】:

                猜你喜欢
                • 2011-12-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-02-08
                • 2016-08-15
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多