Schreiben Sie eine Befehlsausgabe in eine Datei und passen Sie eine Zeichenfolge an

380
user3834663

Ich bin neu in Perl. Ich schreibe das folgende Skript, um die Systemstartzeitinformationen aus dem Windows-Befehl zu drucken systeminfo. Hier sehen einige Probleme aus. Ich bekomme die Ausgabe so.

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. 
0
Was ist Zeile 8? Putnik vor 6 Jahren 0
Sie öffnen zweimal $ cmd. Aus Perl-Sicht gibt es keine Fehler, aber für jeden, der Ihren Code pflegen muss, verwirrend Putnik vor 6 Jahren 0

2 Antworten auf die Frage

0
Putnik

Hast du Klammern vergessen?

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

zu

open (my $cmd, '<:encoding(UTF-8)', $file) or die; 
Klammern sind nicht obligatorisch Toto vor 5 Jahren 0
0
Toto

Sie versuchen, jede durch den Befehl systeminfo angegebene Zeile zu öffnen. Sie sind keine Dateien, sondern Informationszeilen.

Eine überarbeitete Version Ihres Skripts könnte Folgendes sein:

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