开发者

Ant: Conditional Copy

I want to overwrite the hosts file on the Windows machine if the user allows it:

<input message="Do you want to overwrite the HOSTS file?"
       addproperty="overwrite.hosts" validargs="yes,no" />

<copy tofile="${env.WINDIR}/system32/drivers/etc/hosts.backup">
    <fileset file="${env.WINDIR}/system开发者_开发百科32/drivers/etc/hosts" />
</copy>

<copy todir="${env.WINDIR}/system32/drivers/etc">
    <fileset file="${trainer.dir}/hosts" />
</copy>

How do I do the copies only if the user says yes?

EDIT:

I tried this:

    <input message="Do you want to overwrite the HOSTS file?" addproperty="overwrite.hosts" validargs="yes,no" />

    <if>
        <equals arg1="${overwrite.hosts}" arg2="yes" />
        <then>
            <copy tofile="${env.windir}/system32/drivers/etc/hosts.backup">
                <fileset file="${env.windir}/system32/drivers/etc/hosts">
                </fileset>
            </copy>

            <copy todir="${env.windir}/system32/drivers/etc">
                <fileset file="${trainer.dir}/hosts">
                </fileset>
            </copy>
        </then>
    </if>

and I get this output:

C:\trainer\build.xml:16: Problem: failed to create task or type if
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.

I'm an ant rookie... What do I need to do?


You could use a condition or a if task for that. (The latter is part of the ant-contrib project.)


You can use an "if" parameter on a target to make it conditional on the property being set.

I've never used the "input" task -- I didn't know it existed until just now (thanks for the heads up!) -- but a quick look at the documentation indicates that it sets the named property to the value entered, i.e. after an "input" the property is always set. So I guess you would need a "condition" to test the value and set or not set some other property.

Something like this. I just ran a quick test and this does work. Namely, if you answer the question "y" it prints the message, and if you answer "n" it does not.

<project name="test" default="do.whatever">
  <target name="decide.do.whatever">
    <input message="So you wanna do this or not?" validargs="y,n" addproperty="wanna"/>
    <condition property="wanna.yes">
      <equals arg1="${wanna}" arg2="y"/>
    </condition>
  </target>
  <target name="do.whatever" depends="decide.do.whatever" if="wanna.yes">
    <echo message="Yeah he wannas."/>
  </target>
</project>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜