在ANT构建文件上工作,其中定义了两个宏,需要从另一个宏调用一个宏。
这是我需要做的(为了简化理解,我简化了整个场景)。我的主要目标是使用两个参数调用FirstMacro。第一个宏需要对接收到的两个参数进行“处理”,然后对SecondMacro进行嵌入式调用。
传递给FirstMacro的参数之一是其中带有“反斜杠”()的文件路径。当我使用echo在宏中打印它时,它可以正常打印。但是,当我通过JavaScript将相同的参数传递给SecondMacro时,反斜杠消失了(而不是C:\ Test,我看到了C:Test)。
保留反斜杠或将其替换为正斜杠的解决方案是什么?
请注意,我正在使用ANT 1.7,并且已经尝试过string.replace(/ \ / g,“ /”)等。
还要注意,您可以复制粘贴下面的整个代码,将其另存为build.xml,然后尝试运行主要任务以查看运行中的问题。
<?xml version="1.0"?>
<project name="build" basedir="." default="main">
<description>
==========================
Macro: Second Macro
==========================
</description>
<macrodef name="secondMacro">
<attribute name="param"/>
<sequential>
<echo>secondMacro param: @{param}</echo>
</sequential>
</macrodef>
<description>
==========================
Macro: FirstMacro
==========================
</description>
<macrodef name="firstMacro">
<attribute name="param1"/>
<attribute name="param2"/>
<sequential>
<echo>firstMacro first param: @{param1}</echo>
<echo>firstMacro second param: @{param2}</echo>
<script language="javascript">
<![CDATA[
var ext = "@{param2}";
if ("".equals(ext)) {
ext = "out";
}
macrotask = project.createTask("secondMacro");
macrotask.setDynamicAttribute("param", "@{param1}" + "."+ext );
macrotask.perform();
]]>
</script>
</sequential>
</macrodef>
<description>
==========================
Target: main target
==========================
</description>
<target name="main">
<firstMacro param1="C:\TestFolder/TestFile" param2=""/>
</target>
</project>
最佳答案
<firstMacro param1="C:\\TestFolder/TestFile" param2=""/>
版画
主要:
[echo] firstMacro第一个参数:C:\ TestFolder / TestFile
[echo] firstMacro第二param:
[echo] secondMacro参数:C:\ TestFolder / TestFile.out
这应该是您的JS代码的问题。我对JS知之甚少,但是反斜杠在大多数语言中表示“这是一个转义字符”。因此,当JS看到单个反斜杠时,它可能会将其视为转义符并进行一些转换...即使您使用beanshell或其他东西,也可能发生类似的情况。
要解决该问题,您可以尝试修改您的JS代码(对不起,对不起),或者尝试使用斜杠(/)代替反斜杠。
更新:您可以使用ant-contrib中的if任务。
这是if任务版本“ firstMacro”的示例。
<macrodef name="firstMacro">
<attribute name="param1"/>
<attribute name="param2"/>
<sequential>
<echo>firstMacro first param: @{param1}</echo>
<echo>firstMacro second param: @{param2}</echo>
<if>
<equals arg1="@{param2}" arg2="" />
<then>
<property name="param" value="@{param1}.out" />
</then>
<else>
<property name="param" value="@{param1}.@{param2}" />
</else>
</if>
<secondMacro param="${param}" />
</sequential>
</macrodef>