将命令输出写入文件并匹配字符串

时间:2017-08-12 17:11:29

标签: perl

我是perl的新手。我正在编写脚本以从windows命令“systeminfo”打印系统启动时间信息。这里看起来有些问题。我得到这样的输出。有人可以帮助我。

    use strict;
    use warnings;
    my $filename = 'sysinfo.txt';
    my @cmdout = `systeminfo`;
    open(my $cmd, '>', $filename) or die "Could not open file '$filename' $!";
    print $cmd @cmdout;
    foreach my $file (@cmdout) {
        open my $cmd, '<:encoding(UTF-8)', $file or die;
        while (my $line = <$cmd>) {
            if ($line =~ m/.*System Boot.*/i) {
                print $line;
            }
        }
    }

输出:死于perl_sysboottime.pl第8行。

1 个答案:

答案 0 :(得分:2)

如打印错误所示,您的脚本在第一次执行时即将死亡

open my $cmd, '<:encoding(UTF-8)', $file or die;

这意味着open无法打开文件。

我不熟悉Windows的命令,但我会按照here给出的示例systeminfo输出。

执行第4行后,数组@cmdout包含systeminfo输出的行。执行第8行时,$file已设置为输出的第一行,或者在我的示例中设置为Host Name: COMPUTERHOPE\n(请注意尾随换行符)。这不是文件名,因此open失败。

看起来你正试图结合两种不同的方式来迭代文件的行,一个在另一个内部。尝试这样的事情:

foreach my $line (@cmdout) {
    if ($line =~ m/.*System Boot.*/i) {
        print $line;
    }
}