Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ant 如何将属性转换为<;的多个参数;执行官>;任务_Ant - Fatal编程技术网

Ant 如何将属性转换为<;的多个参数;执行官>;任务

Ant 如何将属性转换为<;的多个参数;执行官>;任务,ant,Ant,我有一个包含多个值的属性,我希望执行一个命令,该属性中的每个值都有一个单独的“-j”参数 例如, 应该执行:mycommand-jfoo-jbar-jhello-jworld 我使用的是Ant 1.7.1,因此不能在任务的元素上使用“prefix”属性(Ant 1.8) 一种解决方法是手动将“-j”直接插入属性,然后使用的“line”属性: …但我更希望属性是一个没有嵌入参数的简单列表 编辑:实际上,我的参数是XML文件中的路径,因此更准确的参数列表应该是: <property nam

我有一个包含多个值的属性,我希望执行一个命令,该属性中的每个值都有一个单独的“-j”参数

例如,

应该执行:mycommand-jfoo-jbar-jhello-jworld

我使用的是Ant 1.7.1,因此不能在任务的
元素上使用“prefix”属性(Ant 1.8)

一种解决方法是手动将“-j”直接插入属性,然后使用
的“line”属性:


…但我更希望属性是一个没有嵌入参数的简单列表

编辑:实际上,我的参数是XML文件中的路径,因此更准确的参数列表应该是:

<property name="arguments" value="/foo/bar /hello/world /a/very/long/path"/>


我希望命令执行时带有参数:“-j/foo/bar-j/hello/world-j/a/very/long/path”。请注意,即使在Windows下,斜杠仍然是正向斜杠(这些是命令的参数,而不是文件名)。

使用一些for循环,下面是一个基于Ant的解决方案:


您可以使用Ant资源工具进行此操作

<property name="arg_list" value="foo bar hello world"/>    
<resources id="arguments">
  <mappedresources>
    <string value="${arg_list}" />
    <filtermapper>
      <replacestring from=" " to=" -j "/>
    </filtermapper>
  </mappedresources>
</resources>
<property name="arguments" value="-j ${toString:arguments}" />
如果列表中有绝对路径,而不仅仅是字符串,请删除
flattmapper

如果您有相对路径,请将
flattmapper
行替换为:

<globmapper from="${basedir}/*" to="*" />

以防止路径转换为绝对路径

如果Windows系统上的arg_列表中有类UNIX的路径,则pathconvert的默认设置将不起作用-路径将转换为Windows样式。相反,要处理列表,请使用:

<pathconvert property="arguments" pathsep=" " targetos="unix">
  <chainedmapper>
    <regexpmapper from="C:(.*)" to="-j \1" />
  </chainedmapper>
  <filelist files="${arg_list}" />
</pathconvert>


请注意
targetos
设置和修改后的regexmapper from参数。

不确定是否适合使用脚本语言,但也可以嵌入脚本来进行解析/重新组装:

我会说,我认为这有点脆弱,因为您明确提到了ANT项目的名称,但取决于您:

<?xml version="1.0" encoding="utf-8"?>
<project name="ScriptProj" basedir=".">

    <property name="arguments" value="foo bar hello world"/>

    <target name="test">

        <script language="javascript">
            <![CDATA[

                argsParm = ScriptProj.getProperty("arguments");
                argsParmAmend = "";
                args = argsParm.split(" ");

                for (i = 0; i < args.length; i++)
                    argsParmAmend = argsParmAmend + "-j " + args[i] + " ";

                // remove trailing string
                ScriptProj.setProperty("arguments.amended", argsParmAmend.substr(0, argsParmAmend.length-1));
            ]]>
        </script>

        <echo>${arguments}</echo>
        <echo>${arguments.amended}</echo>

    </target>

</project>

${arguments}
${arguments.modified}

这很接近,但实际上我的arg_列表是XML文件中的路径列表。文件列表将这些文件视为真实文件,而不是真实文件。例如@jfritz42 I添加了一个字符串处理解决方案,避免了pathconvert出现的路径处理问题。。。给出一个错误:“资源不支持嵌套的“mappedresources”元素。@jfritz42-抱歉,我筛选出您使用的是Ant 1.7.1-mappedresources在1.8.0中是新的。请注意,我还修改了pathconvert描述以解决您的问题-在使用绝对路径时省略扁平映射器。嗨,Martin,您的pathconvert解决方案不太有效。它将“/foo/bar/hello/world/a/very/long/path”转换为“-j bar-j world-j path”。如果我取出扁平映射器,它会变成“-jc:\foo\bar-jc:\hello\world-jc:\a\very\long\path”。我想要“-j/foo/bar-j/hello/world-j/a/very/long/path”。谢谢你的麻烦。
<globmapper from="${basedir}/*" to="*" />
<pathconvert property="arguments" pathsep=" " targetos="unix">
  <chainedmapper>
    <regexpmapper from="C:(.*)" to="-j \1" />
  </chainedmapper>
  <filelist files="${arg_list}" />
</pathconvert>
<?xml version="1.0" encoding="utf-8"?>
<project name="ScriptProj" basedir=".">

    <property name="arguments" value="foo bar hello world"/>

    <target name="test">

        <script language="javascript">
            <![CDATA[

                argsParm = ScriptProj.getProperty("arguments");
                argsParmAmend = "";
                args = argsParm.split(" ");

                for (i = 0; i < args.length; i++)
                    argsParmAmend = argsParmAmend + "-j " + args[i] + " ";

                // remove trailing string
                ScriptProj.setProperty("arguments.amended", argsParmAmend.substr(0, argsParmAmend.length-1));
            ]]>
        </script>

        <echo>${arguments}</echo>
        <echo>${arguments.amended}</echo>

    </target>

</project>