2011-01-27 38 views
12

Tôi muốn ghi đè lên các tập tin host trên máy tính Windows nếu người dùng cho phép nó:Ant: Conditional Sao chép

<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}/system32/drivers/etc/hosts" /> 
</copy> 

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

Làm thế nào để làm các bản sao chỉ khi người dùng nói có?

EDIT:

Tôi cố gắng này:

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

và tôi nhận được kết quả này:

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. 

Tôi là một tân binh ant ... Tôi cần phải làm gì?

Trả lời

7

Bạn có thể sử dụng tham số "if" trên một đích để làm cho nó có điều kiện trên thuộc tính đang được đặt.

Tôi chưa bao giờ sử dụng tác vụ "nhập" - tôi không biết nó tồn tại cho đến bây giờ (cảm ơn những người đứng đầu!) - nhưng xem nhanh tài liệu cho biết rằng nó đặt thuộc tính được đặt tên đối với giá trị được nhập, tức là sau khi nhập "đầu vào", thuộc tính luôn được đặt. Vì vậy, tôi đoán bạn sẽ cần một "điều kiện" để kiểm tra giá trị và thiết lập hoặc không thiết lập một số tài sản khác.

Điều gì đó tương tự. Tôi chỉ chạy một bài kiểm tra nhanh và điều này không hiệu quả. Cụ thể là, nếu bạn trả lời câu hỏi "y", nó sẽ in thông báo và nếu bạn trả lời "n" thì không.

<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

cho điều này tôi phải tạo thêm một mục tiêu. Đó là cho tất cả các công việc có điều kiện tôi phải kiểm tra nó sau đó thiết lập tài sản và tạo mục tiêu mới sẽ được gọi trên thuộc tính thiết lập? Bất kỳ cách nào khác ? –

+0

Vâng, chính xác, nếu bạn nhắm mục tiêu sao chép nhiều tệp khác nhau từ các địa điểm khác nhau và bạn CHỈ muốn sao chép một số tệp nhưng không phải tệp khác ... bạn cần mục tiêu thừa với cùng một tập hợp tác vụ, cùng với điều kiện bên trong mục tiêu để quyết định nhiệm vụ gọi điện thoại hay không – sloven

9

Bạn có thể sử dụng số condition hoặc if task cho điều đó. (Sau này là một phần của dự án ant-contrib.)

+1

Không thực sự là tác vụ điều kiện. –

+2

Đã không sử dụng kiến ​​trong một thời gian dài, vì vậy tôi đã không chắc chắn về danh pháp, nhưng thực sự trong tài liệu 'điều kiện' xuất hiện dưới nhiệm vụ (http://ant.apache.org/manual/Tasks/). – miku

Các vấn đề liên quan