Schreiben Sie eine Befehlsausgabe in eine Datei und gleichen Sie eine Zeichenfolge ab

Schreiben Sie eine Befehlsausgabe in eine Datei und gleichen Sie eine Zeichenfolge ab

Ich bin neu bei Perl. Ich schreibe das folgende Skript, um die Informationen zur Systemstartzeit aus dem Windows-Befehl auszudrucken systeminfo. Hier scheint es ein Problem zu geben. Ich erhalte die folgende Ausgabe.

Könnte mir jemand helfen

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;
        }
    }
}

Ausgabe:

Died at perl_sysboottime.pl line 8.

Antwort1

Klammern vergessen?

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

Zu

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

Antwort2

Sie versuchen, jede Zeile zu öffnen, die der Befehl systeminfo liefert. Es handelt sich dabei nicht um Dateien, sondern um Zeilen mit Informationen.

Eine überarbeitete Version Ihres Skripts könnte wie folgt aussehen:

use strict;
use warnings;
my @cmdout = `systeminfo`;
foreach my $line (@cmdout) {
    print $line if $line =~ /System Boot/i;
}

oder, wenn Sie Daten behalten möchten in$filename

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 $line (@cmdout) {
    print $cmd $line if $line =~ /System Boot/i;
}

verwandte Informationen