Perl-Skript zum Batch-Äquivalent

Perl-Skript zum Batch-Äquivalent

Ich habe eine PERL-Datei erstellt, aber da sie recht simpel ist, scheint es ein wenig übertrieben, Leuten 16 MB PERL auf einem USB-Stick zu schicken, nur um ein Programm auszuführen. Daher frage ich mich, ob eine kleinere DOS-Batchdatei funktionieren könnte. (Ich weiß, dass der wichtigste Teil – EXIFTOOL – von CMD aus ausgeführt werden kann. (Ich werde den Code bald beifügen.)

Hier ist die Zeit-txt-Datei:

ABC|10:15
DEF|10:30
XYZ|10:40  

Das Skript lädt die Fotos, ordnet sie in numerischer Reihenfolge (anstatt 1, 10, 2, 20, wie es die Standardsortierung ergibt) und ermittelt mithilfe von EXIF, wann das Foto aufgenommen wurde. Es nimmt die beiden obersten Werte aus der Datei. „Wenn Zeit > A && Zeit < B, in Ordner verschieben“ Ein Zeitstempel von 10:16, 10:20, 10:25 wird also nach ABC verschoben.

Der Zeitstempel 10:33 liegt jedoch über B, also wird B zum neuen A und die nächste Zeit wird aus der Textdatei (10:40) abgerufen. Daher werden jetzt alle Zeitstempel zwischen 10:30 und 10:40 in den Ordner DEF verschoben. (Ich füge am Ende der Zeitdatei einen Dummy-Eintrag hinzu, damit X+1 nicht versucht, über das Dateiende hinaus zu lesen. Die Schleife ist auf @data-1 eingestellt. Wenn die Datei also 12 Zeilen lang ist, wird bis 11 geschleift und x+1 aus der Dummy-Zeile am Ende gelesen, was JETZT ist, und keine Fotos werden diesen Zeitstempel haben.)

Glauben Sie, dass diese Schleifen/Leseverzeichnisse/If-Anweisungen in einer einfachen Batchdatei zusammengefasst werden könnten?

    #!/usr/bin/perl

    use v5.10;
    use strict;
    use warnings;
my $photoFolder='../../EventsSoft/photos';
use Image::ExifTool;
use File::Copy;
use Time::Local;

### IMPORTANT ###
my $mainFolder='AHS_school';
### IMPORTANT ###

if (!defined $mainFolder || $mainFolder eq ''){
mkdir $photoFolder.'/temp';
$mainFolder='temp';
}
elsif (not -e $photoFolder.'/'.$mainFolder){
mkdir $photoFolder.'/'.$mainFolder;
}


my $exif=new Image::ExifTool;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst,$currentFile,$nextFile,$barcode,$dummy);
my @timePic;
my @checkPics;

opendir my $ht, $photoFolder or die "Could not open photo folder for reading '$!'\n";
my @ht = grep {/\.jpg$/} readdir $ht;           # Only keep the JPG files
closedir $ht;

@checkPics = map  { $_->[0] }               # Sorts the files so run 1,2,3 not 1,11,12
             sort { $a->[1] <=> $b->[1] }
             map  { [$_, $_=~/(\d+)/] } @ht;

for (my $x=0; $x<@checkPics; $x++){
$exif->ExtractInfo($photoFolder.'/'.'photo'.$x.'.jpg');
$timePic[$x]=$exif->GetValue('CreateDate');
}

open (my $fh, '<', $photoFolder.'/photog1.dat') or die "Could not open photog1.dat for reading '$!'\n";
my @data=<$fh>;
close($fh);
chomp @data;

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    if ($mon eq 11){
    $mon=0;
    }
    else{
    $mon++;
    }
my $str = sprintf ("%02d:%02d %02d:%02d:%02d", $mon, $mday, $hour, $min, $sec);
my $fakeTime='XXXXXX|'.($year+1900).':'.$str;
push (@data,$fakeTime); # Saves time in ISO format

# @data holds the time barcode scanned in the format XXXAGK|2019-03-15 11:14:00
# @checkPics holds the image filename
# @timePic holds time photo was taken
# The fake entry stops reading beyond end of file with ($y+1) option below. Np photos would have been taken at this time/date


for (my $x=0; $x<@data-1; $x++){
($barcode,$currentFile)=split('\|',$data[$x]);      # Gets the top value off data, and gets the barcode
($dummy,$nextFile)=split('\|',$data[($x+1)]);       # Gets the next value down - files to be below this value
    for (my $y=0;$y<@timePic; $y++){
        if ($timePic[$y] eq 0){
        next;
        }
        if ($timePic[$y] lt $nextFile){
        mkdir $photoFolder.'/'.$mainFolder.'/'.$barcode;
        copy ($photoFolder.'/'.$checkPics[$y], $photoFolder.'/'.$mainFolder.'/'.$barcode.'/'.$checkPics[$y]) or die "Copy failed line 70 '$!'\n";
        $timePic[$y]=0;
        }
        if ($timePic[$y] gt $nextFile){
        last;
        }
    }
}

## Because the above loop is @data-1; we do not get to the last entry, so need one final loop
my $picEnd=@data;
($barcode,$dummy)=split('\|',$data[$picEnd-2]); # Gets the final barcode
    for (my $y=0;$y<@timePic; $y++){
        if ($timePic[$y] eq 0){
        next;
        }
        mkdir $photoFolder.'/'.$mainFolder.'/'.$barcode;
        copy ($photoFolder.'/'.$checkPics[$y], $photoFolder.'/'.$mainFolder.'/'.$barcode.'/'.$checkPics[$y]) or die "Copy failed line 86'$!'\n";
    }
if ($mainFolder eq 'temp'){
rename $photoFolder.'/temp',$photoFolder.'/!! TEMP !!'; 
}

say "All photos have been moved to their respective folders";

verwandte Informationen