如何获取Windows命令行字符串?

时间:2014-08-12 17:19:57

标签: string perl cmd carriage-return

我从以下代码中创建了一个简单的可执行文件(string.exe)。您无法更改此文件。

$| = 1;
foreach my $i (1..10) {
    print "test : $i\r";
    sleep 2;
}

我想实时获取该程序的输出。我尝试使用以下代码执行此操作:

open(my $fh, '-|', 'string.exe') or die $!;
while (my $line = <$fh>) {
    print $line;
}

但我无法实时获得输出。在我看来,这是由于使用回车(\r)。

4 个答案:

答案 0 :(得分:3)

readline<>)读取,直到遇到换行符,但您发送回车符。 readline在某种程度上是可配置的(通过$/),但不能指示它在返回CR或LF之前读取它。

只要数据可用,

sysread,otoh就会返回。这正是你想要的。

$| = 1;
while (sysread($fh, my $buf, 64*1024)) {
    print $buf;
}

答案 1 :(得分:2)

您可以将$INPUT_RECORD_SEPARATOR设置为\r

local $/ = "\r";
while (my $line = <$fh>) {

答案 2 :(得分:0)

  

如何获取windows命令行字符串?

如果我理解你的问题,你可以使用像

这样的东西
local $cmd = join " ", $0, @ARGV;
print $cmd;

答案 3 :(得分:0)

测试choroba关于$INPUT_RECORD_SEPARATOR的答案:

use strict;
use warnings;

# As described in http://perldoc.perl.org/perlipc.html#Safe-Pipe-Opens
my $pid = open(KID_TO_READ, "-|") // die "can't fork: $!";

# Parent
if ($pid) {
    local $/ = "\r";
    while (<KID_TO_READ>) {
        use Data::Dump;
        dd $_;
    }
    close(KID_TO_READ) or warn "kid exited $?";

# Child
} else {
    local $| = 1;
    foreach my $i (1..10) {
        print "test : $i\r";
        sleep 2;
    }
    exit;
}

输出:

"test : 1\r"
"test : 2\r"
"test : 3\r"
"test : 4\r"
"test : 5\r"
"test : 6\r"
"test : 7\r"
"test : 8\r"
"test : 9\r"
"test : 10\r"

具有讽刺意味的是,这个测试在Windows上不起作用:

'-' is not recognized as an internal or external command,
operable program or batch file.
kid exited 256 at test_RS.pl line 14.

但是,这仍然证实$RS将按照记录的方式运作。