在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>

10-05 19:51