用Ant调用系统命令或外部程序
2011-05-20 13:48
302 查看
用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仍然继续
调用系统命令
或外部程序
最近用到了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仍然继续
相关文章推荐
- 从Ant调用系统命令或外部程序
- 从Ant调用系统命令或外部程序
- 用Ant调用系统命令或外部程序
- 从Ant调用系统命令或外部程序
- php 调用系统命令 执行外部程序
- MySQL 实现调用外部程序和系统命令
- MySql UDF 调用外部程序和系统命令
- MySQL 实现调用外部程序和系统命令
- MySql UDF 调用外部程序和系统命令
- MySQL 实现调用外部程序和系统命令
- PowerShell中调用外部程序和进程操作命令例子
- [MySQL FAQ]系列 -- mysql如何调用系统外部程序
- JAVA调用系统命令或可执行程序
- Python调用外部系统命令
- JAVA调用系统命令或可执行程序--返回一个Runtime运行时对象,然后启动另外一个进程来执行命令
- PHP 调用外部系统命令
- Java调用外部程序命令
- JAVA学习22_在Java中执行脚本命令以及调用外部程序说明
- 程序中调用另一个现成的可执行程序或系统命令
- Linux中 别名、内部命令、外部命令、hash缓存表 系统调用时的优先级比较