1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
#!/usr/bin/perl use strict; use warnings; use 5.010; ########################################################### # Def my @pfade = ("test_archive_broschüre"); # Quelle(n) my $ziel_zip = 'test.zip'; # Zieldatei ########################################################### # Pre say("\n\n\n".('-' x 80)."\ngeht los"); require Encode; require Archive::Zip; $Archive::Zip::UNICODE = 0; # Name "Archive::Zip::UNICODE" used only once... if ($^O =~ /mswin/i) { $Archive::Zip::UNICODE = 1; } Archive::Zip->setErrorHandler( sub { $_[0] =~ s/[ \r\n]$//g; say("FEHLER '$_[0]' mit caller '".join('*',caller)."'"); goto(ENDE); } ); say("Archive::Zip Version: ".(Archive::Zip->VERSION)); ########################################################### { # write ZIP my $zip = Archive::Zip->new(); while (scalar(@pfade)) { my $pfad = shift(@pfade); if (opendir(my $fh,$pfad)) { foreach my $file (sort {$a cmp $b} readdir($fh)) { next() if $file eq '.' || $file eq '..'; my $win_konsole; { # Gegenprobe my $roh = Encode::decode('iso-8859-1',$file); say "Roh: '$roh'"; $win_konsole = Encode::encode('cp850',$roh); say "Win: '$win_konsole'"; } if (-d "$pfad/$file") { push(@pfade,"$pfad/$file"); } else { say("add '$pfad/$file'"); my $file_member = $zip->addFile({ filename => "$pfad/$file", compressionLevel => Archive::Zip::COMPRESSION_LEVEL_FASTEST(), }); } } } } if (!-f $ziel_zip || unlink($ziel_zip)) { unless($zip->writeToFileNamed($ziel_zip) == Archive::Zip::AZ_OK()) { die("Fehler in ".__LINE__); } } else { die("Fehler in ".__LINE__); } } ########################################################### { # read ZIP my $zip = Archive::Zip->new(); if ($zip->read($ziel_zip) == Archive::Zip::AZ_OK()) { if (exists $zip->{members} && scalar(@{$zip->{members}})) { foreach my $ref (@{$zip->{members}}) { my $fn = $ref->{fileName}; say("Dateiname im ZIP: ====> '$fn' <===="); } } else { die("Fehler in ".__LINE__); } } else { die("Fehler in ".__LINE__); } } ########################################################### # End ENDE: say("Fertig\n".('-' x 80));
Quote--------------------------------------------------------------------------------
geht los
Archive::Zip Version: 1.57
Roh: 'brosch³re.txt'
Win: 'broschüre.txt'
add 'test_archive_brosch³re/brosch³re.txt'
Wide character in say at test_archive.pl line 74.
Dateiname im ZIP: ====> 'test_archive_brosch´┐¢re/brosch´┐¢re.txt' <====
Fertig
--------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
--------------------------------------------------------------------------------
geht los
Archive::Zip Version: 1.30
Roh: 'broschüre.txt'
Win: 'broschǬre.txt'
add 'test_archive_broschüre/broschüre.txt'
Dateiname im ZIP: ====> 'test_archive_broschüre/broschüre.txt' <====
Fertig
--------------------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
#!/usr/bin/perl use strict; use warnings; use 5.010; use Encode; ########################################################### # Def my @pfade = ("test_archive_broschüre"); # Quelle(n) my $ziel_zip = 'test.zip'; # Zieldatei my $siebenzip = 'c:/programme/7-zip/7z.exe'; # Installationsort 7-Zip my $comp_rate = 9; # Komprimierungsgrad # von 0/garnicht+schnell bis 9/stark+langsam ########################################################### # Pre say("\n\n\n".('-' x 80)."\ngeht los"); close(STDERR); # alternativ umleiten je nach Einsatzort # 7-Zip gibt Fehler auf STDERR und STDOUT aus # und da STDOUT schon geholt wird brauchen wir STDERR nicht auch noch my $output = `"$siebenzip" -h`; if ($output =~ /^7-zip \[(\d\d)\] (\d+)\.(\d+).+(\d\d\d\d)-(\d\d)-(\d\d)$/im) { say("Installierte Version von 7-Zip: $2.$3 vom $6.$5.$4 in $1 Bit Architektur"); if (!-f $ziel_zip || unlink($ziel_zip)) { $_ =~ s/\//\\/g for @pfade; my $quellen = '"'.join('" "',@pfade); $quellen .= ($quellen !~ /\\$/ && $quellen !~ /\*$/? '\\' : '') .($quellen !~ /\*\.\*$/ ? '*.*' : ''); my $kommando = join(' ',( '"'.$siebenzip.'"', 'a', # add / hinzufügen '-r', # recurse / Unterverzeichnisse einschließen "-mx=$comp_rate", # set compression Method / Komprimierungsstärke $ziel_zip, $quellen, )); $output = `$kommando`; my $regex_mit_verz = qr{ Scanning the drive: (\d+) folder([s]?), (\d+) file([s]?), (\d+) bytes(.*) Creating archive: $ziel_zip Items to compress: (\d+) Files read from disk: (\d+) Archive size: (\d+) bytes(.+) Everything is Ok }m; my $regex_ohne_verz = qr{ Scanning the drive: (\d+) file([s]?), (\d+) bytes(.*) Creating archive: $ziel_zip Items to compress: (\d+) Files read from disk: (\d+) Archive size: (\d+) bytes(.+) Everything is Ok }m; my $fertig = sub { my ($ma) = @_; my ($quelle_verz,$quelle_dateien,$quelle_bytes,$ziel_anz_gesamt,$ziel_bytes); if (scalar(@$ma) == 10) { $quelle_verz = $ma->[0]; $quelle_dateien = $ma->[2]; $quelle_bytes = $ma->[4]; $ziel_anz_gesamt = $ma->[6]; $ziel_bytes = $ma->[8]; } else { $quelle_verz = 0; $quelle_dateien = $ma->[0]; $quelle_bytes = $ma->[2]; $ziel_anz_gesamt = $ma->[4]; $ziel_bytes = $ma->[6]; } if ($quelle_verz + $quelle_dateien == $ziel_anz_gesamt) { if ($quelle_bytes) { my $rate = int(100 / $quelle_bytes * $ziel_bytes); if ($rate != 100) { say("Komprimierung erfolgte, das ZIP betraegt $rate % von der Summe der" ." Ursprungsgroesse aller Dateien ($ziel_bytes von $quelle_bytes Byte)"); } else { say("Es wurde keine (nennenswerte) Komprimierung durchgefuehrt"); } } else { say("In dem/den Quellverzeichnis/-sen wurde/-n keine Datei/-en gefunden"); if (!$ziel_anz_gesamt) { say("Das ZIP ist leer"); } } } else { say("Fehler in ".__LINE__.": $quelle_verz Verzeichnis/-se + $quelle_dateien" ." Datei/-en != $ziel_anz_gesamt Element/-e"); exit(); # die() ist hier nicht angezeigt, weil dessen Text auf STDERR # gehen würde, was wir aber oben geschlossen hatten } }; if ($output =~ $regex_mit_verz || $output =~ $regex_ohne_verz) { my @matches = map {;no strict 'refs'; $$_} 1 .. $#-; # $matches[0] = $1 $matches[1] = $2 $matches[2] = $3 usw. # Quelle: http://www.perlmonks.org/?node_id=959528 $fertig->(\@matches); } else { say("Fehler in ".__LINE__.":\n$output\n"); exit(); } } else { say("Fehler in ".__LINE__); exit(); } } else { say("Fehler in ".__LINE__); exit(); } ########################################################### # End say("Fertig\n".('-' x 80));
2016-05-06T06:19:23 MarkusHHallo bianca,
2016-05-06T06:19:23 MarkusHDas Skript stört sich an dem Leerzeichen.
my $output = `$siebenzip -h`;
my $siebenzip = 'c:/programme/7-zip/7z.exe'; # Installationsort 7-Zip
$siebenzip = 'C:/Progra~1/7-Zip/7z.exe'