如何使用Perl获取DOS工具的命令行输出?

时间:2009-02-20 09:18:39

标签: perl command-line ftp stdout

我想在Perl脚本中使用Windows内置FTP工具来确保链接的吞吐量。因此,该脚本将创建以下命令脚本:

open <ip>
<username>
<password>
hash
get 500k.txt
quit

然后我使用以下Perl代码运行命令脚本:

system(@args);
@args = ("ftp", "-s:c:\\ftp_dl.txt");
system(@args);

如果我在DOS框中运行命令,输出如下所示:

ftp> open <ip>
Connected to <ip>
220 "Welcome to the fast and fabulous DUFTP005 ftp-server :-) "
User (<ip>:(none)):
331 Please specify the password.

230 Login successful.
ftp> hash
Hash mark printing On  ftp: (2048 bytes/hash mark) .
ftp> get 500k.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for 500k.txt (14336 bytes).
#######
226 File send OK.
ftp: 14336 bytes received in 0.00Seconds 14336000.00Kbytes/sec.
ftp> quit
221 Goodbye.

为了能够获得吞吐量,我需要提取行:

 ftp: 14336 bytes received in 0.00Seconds 14336000.00Kbytes/sec.

我对Perl不太熟悉。有人知道如何获得这条线吗?

4 个答案:

答案 0 :(得分:5)

在管道模式下使用open

open($filehandle, "$command|") or die "did not work: $! $?";
while(<$filehandle>)
{
#do something with $_
}

或使用反引号:

my  @programoutput=`$command`

答案 1 :(得分:2)

can't get the output with system()

而是使用bactkicks:

my $throughput = 0;
my $output = `ftp -s:c:\\ftp_dl.txt`;
if (($? == 0) && ($output =~ /([\d+\.]+)\s*K?bytes\/sec/m)) {
    $throughput = $1;
}

$output将包含执行ftp命令的所有行(但不包含发送到STDERR的任何错误消息)。
然后我们检查ftp是否返回成功(0)以及输出中是否有吞吐量。
如果是这样,我们会将$throughput设置为它。

这是Perl,有很多方法可以做到这一点:

您还可以使用支持Windows的Net::FTP模块来处理文件传输,并使用Time::HiRes等计时模块对其进行计时并计算吞吐量。

这样你就不会依赖ftp程序了(你的脚本不适用于Windows的本地化版本,例如没有太多的重新工作,你需要依赖ftp程序安装并在同一个位置)。

答案 2 :(得分:2)

请参阅perlfaq8,其中有几个答案可以解决此问题。你可能需要的问题是:

此外,您可能对标准库中的一些IPC(进程间通信)Perl模块感兴趣:

  • IPC :: Open2
  • IPC :: Open3

部分Perl文档也可能有所帮助:

如果您不熟悉Perl文档,可以查看我的Perl documentation documentation

祝你好运,

答案 3 :(得分:-2)

您应该尝试使用更适合此任务的libcurl

有一个easy to use API