Как я могу получить вывод командной строки DOS-инструмента, использующего Perl? - PullRequest
3 голосов
/ 20 февраля 2009

Я хочу измерить пропускную способность ссылки, используя встроенный в Windows инструмент FTP внутри скрипта Perl. Поэтому скрипт создает следующий командный скрипт:

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 ]

5 голосов
/ 20 февраля 2009

Используйте open в режиме конвейера:

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

или используйте обратные метки:

my  @programoutput=`$command`
2 голосов
/ 20 февраля 2009

См. perlfaq8 , в котором есть несколько ответов на эту тему. Те, которые вам, вероятно, нужны для этого вопроса:

Также вас могут заинтересовать некоторые модули Perl IPC (Interprocess Communication), входящие в стандартную библиотеку:

  • IPC :: open2
  • IPC :: open3

Некоторая документация по Perl также может помочь:

  • perlipc - межпроцессное взаимодействие Perl
  • perlopentut - Открытое руководство по Perl

Если вы не знакомы с документацией по Perl, вы можете проверить мою документацию по Perl .

Удачи,

2 голосов
/ 20 февраля 2009

Вы не можете получить вывод с 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, есть много способов сделать это:

Вы также можете использовать модуль Net::FTP, который поддерживает Windows, для обработки передачи файлов и использовать модуль синхронизации, такой как Time :: HiRes , чтобы рассчитать его и рассчитать производительность .

Таким образом, вы не будете зависеть от программы ftp (ваш скрипт не будет работать в локализованной версии Windows, например, без особых переделок, и вам нужно полагаться на программу ftp, которая будет установлена ​​и находится в том же месте) ).

0 голосов
/ 20 февраля 2009

Вы должны попробовать и использовать libcurl , который больше подходит для этой задачи.

Существует простой в использовании API

...