打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用Ant调用系统命令或外部程序

Ant调用系统命令或外部程序


最近用到了Ant,发现还是有许多功能是Ant没有提供相应Task支持,而操作系统提供了相应的系统命令。
Ant说明书上说了,用<exec>可以调用系统命令,实际操作起来才发现陷阱可不少,一不小心就会掉下去。
下面以按日期倒序列举当前目录下文件为例说明。

对于Windows平台,命令是:dir /o:-d

对于Unix(包括Linux,下同)平台,命令是 ls –ltr


陷阱1:调用谁?

这在Ant文档中已经提到了,在Windows下,不能直接调用dir、del(因为没有这个程序!)等,必须通过cmd.exe来调用:

<?xml version="1.0" ?>

<project name="testExec" default="test">
     <target name="test">
            <exec executable="cmd.exe">
                   <arg line="/c dir"/>
            </exec>
     </target>
</project>

 

对于Unix,则可以直接调用ls:

<?xml version="1.0" ?>
<project name="testExec" default="test">
     <target name="test">
            <exec executable="ls"/>
     </target>

</project>

也可以指明由Shell调用

<?xml version="1.0" ?>
<project name="testExec" default="test">
     <target name="test">
            <exec executable="/bin/sh">
                   <arg line="-c ls" />
            </exec>
     </target>
</project>

我觉得后者要好一些,否则无法保证调用的是否系统命令,
因为只要Path环境变量指明的路径下有一个同名的程序,都可能被调用到。
通过Shell调用,Windows必须加 /c,Unix则是加 –c 。

 

陷阱2:arg line, arg value 还有引号

假如我们扩充Windows平台下的例子,满足按修改时间倒序的要求:
<?xml version="1.0" ?>

<project name="testExec" default="test">
     <target name="test">
            <exec executable="cmd.exe">
                   <arg line="/c dir /o-d"/>
            </exec>
     </target>
</project>

成功。换Unix了:

<?xml version="1.0" ?>
<project name="testExec" default="test">
     <target name="test">
            <exec executable="/bin/sh">
                   <arg line="-c ls -ltr" />
            </exec>
     </target>
</project>

对不起,失败:java.lang.IOException。

之所以这样,是因为<arg line>把每个空格分隔的字符串作为参数传给调用程序,
但是对于”/bin/sh”来说,”ls –ltr”应该是一个参数而不是两个。
解决办法有两个:

加引号:

<?xml version="1.0" ?>
<project name="testExec" default="test">
     <target name="test">
            <exec executable="/bin/sh">
                   <arg line="-c 'ls –ltr'" />
            </exec>
     </target>
</project>

或者使用<arg value>:

<?xml version="1.0" ?>
<project name="testExec" default="test">

     <target name="test">
            <exec executable="/bin/sh">
                   <arg value="-c" />
                   <arg value="ls -ltr" />
            </exec>
     </target>

</project>

 

陷阱3:阻塞(block)

不论是Windows还是Unix,调用一个程序后都必须等到该操作结束才能继续作下面的操作。
如果你想调用一个程序的同时还做其它的工作,必须使用<parallel>:

<?xml version="1.0" ?>

<project name="testExec" default="test">
     <target name="test">
            <exec executable="notepad.exe"/>
            <echo message="You must close notepad first!"/>   
            <parallel>
                   <exec executable="notepad.exe"/>
                   <echo message="You do not need to close notepad."/>
            <parallel>
     </target>
</project>

 

需要注意的属性:

dir               指明程序执行的路径。对搜索程序也有影响

os                指明执行的平台

failonerror    缺省为false,即该命令执行了但是失败了,build仍然继续

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
无所不能的“蚂蚁”--Ant(一)(二)(三)(四)
基于Jenkins实现php项目的自动化测试 打包和自动部署
ant 条件判断 condition
Shell编程入门:Linux解释器原理-源码天堂-华夏名网资讯中心 虚拟主机,域名注册,...
每天一个linux命令(20):find命令之exec
如何统计 Linux 中文件和文件夹/目录的数量
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服