我正在尝试使用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>
答案 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值。这应该可以让你了解开始令牌和结尾会给你带来的问题。
所以这就是我简单的做法
这是我做的。 (可能在语法上不正确,因为我现在不在代码前面)
<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" />