Наименование файла на текущую дату - PullRequest
0 голосов
/ 25 апреля 2019

Я очень плохо знаком с Perl, я привык к C #

Я анализирую несколько XML-файлов для некоторых антивирусных данных, несколько раз в день. Я пытаюсь присвоить этому файлу имя текущей даты месяца, то есть 20190425. И хотя его имя совпадает, оно добавляется к этому файлу, если его новый день, то есть 20190426, оно создает этот новый файл и начинает добавлять к нему.

Я думаю, используя функцию log, я мог бы "автоматизировать" проверку, так как она просто проверила бы, существует ли имя файла.

open (LOG, '>> report.txt'); # Добавить к report.txt

Можно ли как-нибудь поставить отметку с этим именем на текущей дате? так было бы скажем, 20190425-Report.txt? И таким образом он автоматически создаст новый файл «завтра» и начнет добавлять к нему

Чтобы имя файла сценария совпадало с текущей датой.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Модуль Time :: Piece изменяет стандартную функцию localtime(), возвращая объект, представляющий текущее время. У этого объекта есть метод strftime(), который будет возвращать это время в виде строки, отформатированной с использованием шаблона, который вы передаете методу.

use feature 'say';
use Time::Piece;

my $now = localtime;

say $now->strftime('%Y%m%d'); # %Y = year; %m = month; %d = date

Вы можете использовать это в своем коде так:

use feature 'say';
use Time::Piece;

my $now = localtime;

my $today = $now->strftime('%Y%m%d');

# Note: I've switched to the three-arg version of open()
# and a lexical filehandle. Both are considered best practice.
# I've also checked the return value from open() and killed
# the program if it fails.
open my $log_fh, '>>', "$today-Report.txt"
  or die "Cannot open $today-Report.txt: $!";

Обновление: В своем последующем ответе вы говорите об ошибках при попытке моего кода. Как вы подозреваете, все эти ошибки проистекают из довольно старой версии Perl, которую вы используете. Perl 5.6.0 был выпущен в марте 2000 года, и я должен отметить, что он очень долго не поддерживался командой разработчиков Perl. Все функции, которые создают проблемы, были добавлены в Perl 5.10.0 (выпущен в декабре 2007 года). Я считаю версию 5.10 абсолютной минимальной версией, которую можно использовать для разумной современной среды разработки Perl. Я настоятельно рекомендую вам перейти на более свежую версию Perl.

Сказав это, можно (конечно) сделать это в вашей древней версии Perl.

use POSIX 'strftime';

my $today = strftime('%Y%m%d', localtime);
print "Today is: $today\n";

my $filename = "$today-Report.txt";

# I'm not sure when modern file-opening practices
# were added to Perl, so I've reverted to using a
# really old syntax.
open LOG, ">>$filename"
  or die "Cannot open $filename: $!";
0 голосов
/ 26 апреля 2019

Спасибо большое за ответы, однако у меня все еще есть проблемы с получением скрипта для компиляции.

Когда я использую пример, который вы написали, Дэйв, я получаю ошибку.Я предполагаю, что это связано с версиями, может быть?Скрипт в Perl 5.6, насколько я могу судить

Не удается найти файл feature.pm в @INC (@INC содержит: C: /perl/perl-5.6.0-win/libC: /perl/perl-5.6.0-win/site/lib.)


То же самое касается "use Time :: Piece;

Canне найти Time / Piece.pm в @ INC


И я не могу заставить мой $ filename = strftime работать.


ЕслиЯ следую примеру Абигейл. Я получаю

Не могу вызвать метод "say" без ссылки на пакет или объект в строке 63 dirlist.pl.

Мне это кажетсякак пример, ближайший к работе.

Затем я попытался с помощью «Открыть» и получил

Не могу использовать строку ("20190426-report.txt") в качестве символа ref, в то время как"строгие ссылки" используются в строке 62 dirlist.pl.

Я извиняюсь, если что-то из этого является базовым Perl, пытаюсь разобраться. Я знаю о неиспользуемых переменных и закомментированных функциях(это я пытаюсь собрать вещи воедино), но мой первый приорНужно заставить скрипт работать так, как задумано, тогда я сделаю некоторую очистку.

Это скрипт

#!/usr/bin/perl

use strict;
use warnings;
use POSIX;
use File::stat;
use File::Basename;
use File::Find;
use File::Copy;
use POSIX qw(strftime);

#To look for more in the virus, add name to array and increase the switch elsif 
my @NAMES = ("Name", "VirusDefinitions", "IPAddress", "OperatingSystem", "AgentVersion", "Infected", "LastScanTime","LastUpdateTime" );
my $DEBUG = 2; # debug on = 1 low, = 2 detailed, = 3 full, = 0 OFF. Will print to screen needed in file the pipe >filename
my $DETAILED = 0; #
#vars
my $path = $ARGV[0];
my $TXT = $ARGV[1];
my $DIR2 = "XX"; #This returns the main dir
my $DIR3 = "XX"; 
my $PROJNO = "XX";
my $FILE1 = "XX"; #This returns the filename
my $CUST = "XX";
my $FILEA="$DIR3\\$FILE1"; #This returns the complete filepath "x:\\folder\\file.txt"
my $NAME="XX";
my $VIRUSDEF="XX"
;my $IP="XX";
my $OS="XX";
my $AGNT="XX";
my $INFEC="XX";
my $LAST="XX";
my $DATE = strftime "%d/%m/%Y", localtime; #Store local (server) time in the $DATE variable
my $LASTUP ="XX";
my $entr = "XX";
my $logname = "report.txt";
my ($day, $month, $year) = (localtime) [3, 4, 5];
my $file_name = sprintf "%04d%02d%02d-report.txt" =>
                        $year + 1900, $month +1, $day;
#make current date time below and 2 digit
my ($sec,$min,$hour,$mday,$mon,$wday,$yday,$isdst) = localtime();
$mon +=1;
my $DATO = sprintf("%02d%02d%02d", $year, $mon, $mday);

# reinitialiser report vars to make sure we can see if we miss one
sub init {
my $NAME="XX";
my $VIRUSDEF="XX";
my $IP="XX";
my $OS="XX";
my $AGNT="XX";
my $INFEC="XX";
my $LAST="XX";
my $LASTUP="XX";
}

#save fixed details 
#open (LOG, '> Report.txt'); #Overrite report.txt
#open (LOG, '>> Report.txt'); #Append to report.txt
#print LOG "Project, Customer-Site, LastUpdateTime, Server-Name, Definition-File, IP-address , Operating-Sys, Agent-Version, Infected, Last-Scan-Time, AntiVirus-file\n" ; #Commented out as we're already defining the values.
#open my $log_fh, '>>', "$today-report.txt"
#   or die "Cannot open $today-report.txt: $!";
open $file_name;



sub report {
$FILEA="$DIR3\\$FILE1";
if ($DEBUG){print "report: $PROJNO\n";}
if ($DEBUG){print "report: $CUST\n";}
if ($DEBUG){print "report: $FILE1\n";}
if ($DEBUG){print "report: $FILEA\n";}
if ($DEBUG){print "report: $LASTUP\n";}


open( FIL, "< $FILEA" )|| die "cant open file $!" ; #This is the filehandler
while (defined ($_ = <FIL>)) {
foreach my $N (@NAMES) {
#print "looking for $N\n" ;
    if  ($_ =~ /$N/) {
    if ($DEBUG gt 2){print "report: Looking for $N\n";}
    $_ =~ /$N(.*)$N/;
    my $TMP = $1;
    $TMP =~ s/[\$#@~!&*()<>\[\];,?^ `\\\/]+//g;
    #Switch that has to be extended if the array NAMES is extended
        if ($N eq "Name") {
        $NAME=$TMP; 
        }elsif ($N eq "VirusDefinitions"){ 
        $VIRUSDEF=$TMP;
        }elsif ($N eq "IPAddress") {
        $IP=$TMP;
        }elsif ($N eq "OperatingSystem") {
        $OS=$TMP;
        }elsif ($N eq "AgentVersion") {
        $AGNT=$TMP;
        }elsif ($N eq "Infected") {
        $INFEC=$TMP;
        }elsif ($N eq "LastScanTime") {
        $LAST=$TMP;}
        elsif ($N eq "LastUpdateTime") {
        $LASTUP=$TMP;
        }
        #}elsif ($N eq "Date") {
        #$DATE=strftime;
        print LOG "date: $DATE, Last Update Time: $LASTUP, pnr: $PROJNO, site: $CUST, serv: $NAME, def: $VIRUSDEF, ipadr: $IP, os: $OS, agntver: $AGNT, inf: $INFEC, lscan: $LAST, file: $FILE1\n" ;
        #init variables again
        init
        }       
    else{
    #print "no match $N\n"
    }
}
#close myfile ;
}

if ($DEBUG){print "report: copy $PROJNO.$FILE1 to Avold\n";}
copy ( "$FILEA", "c:\\Avold\\$PROJNO.$FILE1") ;

if ($DEBUG){print "options to script :  $path  AND  $TXT : DATE was : $DATO \n ";}
#if argv txt make a copy of the xml as txt file customer_attachments. 

if ( $TXT eq "txt" ){ 
#chop($CUST);
if ($DEBUG){print "inside if options to script :  $path  AND  $TXT  DATO =$DATO \n";}
copy ( "$FILEA", "c:\\AVDownload\\_Customer_attachments\\$PROJNO-$DATO-AntiVirusReport-$CUST.txt") ;
}

#Close filehandler/file so that we can unlink/delete the file
close FIL ;
#remove the files if a copy exists
if ( -e "c:\\Avold\\$PROJNO.$FILE1")
{
unlink glob "c:\\AVDownload\\$entr\\*.xml";
print "$path $entr\n";
print "file : $PROJNO.$FILE1: DIR2=$DIR2 and DIR3=$DIR3\n";
}else{
print "file is not there";
}

} #end report


 #   unless -d $path;
#main
opendir( my $DIR, $path );
while ( my $entry = readdir $DIR ) {
    next unless -d $path . '/' . $entry;
    next if $entry eq '.' or $entry eq '..';
$DIR2 = $path . $entry . '\\' ;
$DIR3 = $path . $entry  ; #\$entry";
$entr=$entry ;



my @names = split /_/, $DIR2, 2 ; 
$PROJNO = $names[0];
$PROJNO =~ s/\D//g ;
$CUST = $names[1];
chop($CUST);
if ($DEBUG gt 1){print "main: $PROJNO and $CUST\n";}
if ($DEBUG gt 1){print "main: $DIR2\n";}


opendir my $dh, $DIR2 or die "Error opening $DIR2: $!";

#my @files = grep(/AntiVirus.zip$/,readdir($dh));
my @files = grep(/AntiVirus.xml$/,readdir($dh));

if (!@files) {
#print "$files[$#files]\n";
if ($DEBUG gt 1){print "main: array was empty = no .zip files found\n";}
if ($DEBUG gt 1){print "main: No antivirus zip files found\n";}
print LOG "$PROJNO, $CUST\n" ;
#report
}else{
if ($DEBUG gt 1){print "main: One or more Antivirus files found, we'll take the newest\n";}
#print "$files[$#files]\n";
$FILE1=$files[$#files];

#call report
report

}
closedir $dh;
}
closedir $DIR;
close LOG ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...