Кто-нибудь сможет быстро просмотреть мой код и попытаться выяснить, чего я не вижу. В настоящее время у меня проблемы с моим отладчиком Perl, так что это не вариант, пока я не исправлю его (в процессе расследования). Вот код:
## Special Variables:
my @args = ();
my $spcl_dir = "$dir_root\\specialprocessing";
my $spcl_log = 'C:\Dad\Eclipse\Repositories\tiffinfo\!specialprocessing.log';
open(FILE, $spcl_log) || die "Couldn't open $spcl_log: $!\n";
for (my $i = 0 ; $i < 5 ; $i++) {
my $dummy = <FILE>;
}
print "\n$spcl_log\n"; # delete me
while (<FILE>) {
print "DEBUG START\n";
my (@fields) = split /;/;
my $filename = $fields[0];
print "Processing $filename";
print "DEBUG END\n";
}
## Copy process
print "\nStarting the copy process over to $spcl_dir:\n";
while (<FILE>) {
print "DEBUG START!\n";
my (@fields) = split /;/;
my $filename = $fields[0];
print "Copying $filename";
if (copy("$dir_root\\$filename", "$spcl_dir\\$filename")) {
print " - Success!\n";
}
else { print " - Failure!\n"; }
}
close(FILE);
## Confirmation of file copy
print "Everything look OK?: ";
chomp(my $confirmcopy = <STDIN>);
if ($confirmcopy =~ /^y|^yes/i ) {
print "\nAttempting to remove original files.\n";
## Original file deletion process
open(FILE, $spcl_log) || die "Couldn't open $spcl_log: $!\n";
for (my $i = 0 ; $i < 5 ; $i++) {
my $dummy = <FILE>;
}
while (<FILE>) {
my (@fields) = split /;/;
my $filename = $fields[0];
print "Attempting to remove: $filename";
if (unlink("$dir_root\\$filename")) {
print " - Success!\n";
}
else { print " - Failure!\n"; }
}
close(FILE);
}
else { print "Will do, exiting."; exit; }
## Conversion process
print "\nAttempting to convert the files.\n";
open(FILE, $spcl_log) || die "Couldn't open $spcl_log: $!\n";
for (my $i = 0 ; $i < 5 ; $i++) {
my $dummy = <FILE>;
}
while (<FILE>) {
my (@fields) = split /;/;
my $filename = $fields[0];
print "Starting conversion on $spcl_log\n";
@args = ("$tiffinfo_path", "$spcl_dir\\$filename", "/bpp=2", "/tifc=4", "/convert=$dir_root\\$filename", "/killmesoftly", "/silent");
system(@args);
unlink("$spcl_dir\\$filename");
}
close(FILE);
Требуемый вывод:
Irfanview Found.
Directory exists. Continuing...
Starting the copy process over to c:\dad\tiffs\specialprocessing:
Copying filename2.tif - Failure!
Everything look OK?: n
Will do, exiting.
c:\Dad\Eclipse\Repositories\tiffinfo>perl c:\Users\Administrator\Desktop\exectif
finfo.pl
Irfanview Found.
Directory exists. Continuing...
Starting the copy process over to c:\dad\tiffs\specialprocessing:
Copying filename2.tif - Failure!
Everything look OK?: y
Attempting to remove original files.
Attempting to remove: filename2.tif - Failure!
Attempting to convert the files.
Starting conversion on filename2.tif
Это, очевидно, будет по-другому, но вы получите картину. Проблема у меня заключается в том, что каждый раз, когда я, кажется, запускаю цикл while, ничего не обрабатывается, ни код не работает. Я даже попробовал простую отладку, такую как операторы print, чтобы увидеть, насколько далеко на самом деле идет код, и ничего при выполнении операторов while.
РЕЗУЛЬТАТ ВЫХОДА (Мне нужно CTRL-C из программы, поскольку она не завершается сама по себе):
C:\Dad\Eclipse\Repositories\tiffinfo\!specialprocessing.log
Starting the copy process over to c:\dad\tiffs\specialprocessing:
Everything look OK?: y
Terminating on signal SIGINT(2)
Оператор print перед циклом while печатает переменную spcl_log:
C:\Dad\Eclipse\Repositories\tiffinfo\!specialprocessing.log
СОДЕРЖАНИЕ ФАЙЛА LOG (первые пять строк всегда будут пропущены - это то, что делает фиктивный цикл):
IRFANVIEW BATCH ROUTINE
Work as: Batch Conversion
Output format: TIF
--OPTIONS: CCITT Fax 4 Save gryscl [default ON]
Adv Options: CHANGE COLOR DEPTH 2 colors (B/W) 1 BPP)
filename2.tif;Smpl/Pix & Bits/Smpl are missing.
СОДЕРЖАНИЕ ВСЕГО СКРИПТА:
#!/usr/bin/perl -w
use strict;
use warnings;
use File::Spec;
use Carp;
use File::Copy;
## Vars
my $dir_root;
my $state;
my $status;
my $batch;
my @files;
my $tifs;
my $executebat;
my $infile;
my $alphachnl;
my $errorlog;
my $corrupt;
my $specialLog;
#my $tiffinfo_path = "c:\\Program Files\\IrfanView\\i_view32.exe";
my $tiffinfo_path = "./converter.pl";
## Usage Vars
my $curVersion = "1.6";
my $options = $ARGV[0];
## Future Use Vars
my $totalErrors = 0;
my $fileCount = 0;
if ($#ARGV >= 0) {
usage() if $#ARGV > 0;
usage() if $options eq "-h";
version() if $options eq "-v";
}
sub version {
print "CompileTiffInfo.exe\n";
print "Version: $curVersion\n";
exit( 0 );
}
sub usage {
print "\nUsage: compileTiffInfo.exe [OPTIONS]\n";
print "Processes a directory of TIF images, and outputs the data to 3 different text files.\n\n";
print "compileTiffInfo.exe (default)\n\tRuns the program through an interactive menu.\n\n";
print "compileTiffInfo.exe -v\n\tShows version information for this program\n\n";
print "compileTiffInfo.exe -h\n\tShows this help menu\n";
exit( 0 );
}
system 'cls';
## Check if tiffinfo is installed.
if (-e $tiffinfo_path) {
print "Irfanview Found." . "\n";
}
else {
print "Irfanview was not found." . "\n";
exit ( 0 );
}
## Check passcode
if (defined($ARGV[0])) {
if ($ARGV[0] ne $curVersion ) {
print "Passcode not recognized.";
exit ( 0 );
}
}
else {
print "Passcode not recognized.";
exit ( 0 );
}
## Start of actual program; asks user where the TIF images are located.
print "Where are your TIF file(s) located? (C:\\directory\\of\\your\\tiff\\files): ";
chomp($dir_root = <STDIN>);
if (! -d $dir_root) {
print "Directory doesn't exist!\n";
exit;
}
if ($dir_root =~ tr/ / /) {
print "There's spaces in your path. Try again.\n";
exit;
}
if ($dir_root =~ /\\$/) {
print "You ended with a slash. This is not allowed; try again.";
exit;
}
print "State: [LA,NM,OK,UT,TX,WY] - [--,none,other]: ";
chomp($state = uc(<STDIN>));
if ($state eq "") {
print "Whoa! No data was entered. Exiting.";
exit;
}
if ($state eq "OTHER" || $state eq "NONE" || $state eq "--") {
print "\n ** NOTE: Entering into STANDARD SPREADSHEET OUTPUT MODE **\n\n"
}
print "Status [nr][hs][tye] or Anything Descriptive: ";
chomp($status = lc(<STDIN>));
print "Batch #? ";
chomp($batch = uc(<STDIN>));
## Define the output file, based on user input
my $batOutput = "\!".$state.$status."INFOraw.txt";
open (BATFILE, "> \!".$state.$status."INFOraw.bat");
print BATFILE "\@echo off\n";
close (BATFILE);
open (BATFILE, ">> \!".$state.$status."INFOraw.bat");
print BATFILE "type nul > $batOutput\n";
close (BATFILE);
## Get a list of tif files from dir_root
## No trailing slash is allowed
opendir(DIR, $dir_root);
@files = grep(/\.ti[f]{1,2}$/i,readdir(DIR));
closedir(DIR);
## Check to see if array has data
if (@files) {
foreach $tifs (@files) {
open (BATFILE, ">> \!".$state.$status."INFOraw.bat");
print BATFILE "tiffinfo TYPE $dir_root"."\\".$tifs." \>> ".$batOutput."\n";
## Need to write to INFO file, for each file, eliminating the .bat file.
close (BATFILE);
}
}
## if array is null (no data), then no tif files were found
else {
print "No Tiff files were found.";
exit;
}
## Run bat script
print "Attempting to execute .bat script now...\n";
$executebat = system 'call !'.$state.$status.'INFOraw.bat > NUL 2>&1';
if ( $executebat != 0 ) {
die "Failed executing .bat script. \n";
}
else { print "Ran .bat script successfully.\n\n"; }
## Debugging Only
#$infile = 'data.txt';
$infile = $batOutput;
## Output File Handles (open)
open(OUT1,"> \!".$state.$status."INFO.txt") or die "Can't open \!".$state.$status."INFO.txt: $!";
open(OUT2,"> \!".$state.$status."INFOspdsht.txt") or die "Can't open \!".$state.$status."INFO.txt $!";
open(ERRLOG,"> \!errors.log") or die "Can't open !errors.log $!";
open(CORRUPT,"> \!corrupt.log") or die "Can't open !corrupt.log $!";
open(SPECIAL,"> \!specialprocessing.log") or die "Can't open !specialprocessing.log $!";
## Print Headers To spdsht file
print OUT2 ";;;;Whitespace;;DPI ReSize;;;\n";
print OUT2 "Filename;Comp;AlphCnl;Foto;Wid;Len;Res 0;x0;;;MB\n";
print CORRUPT "Filename;Reason For Failure\n";
print SPECIAL "IRFANVIEW BATCH ROUTINE\nWork as: Batch Conversion\nOutput format: TIF\n--OPTIONS: CCITT Fax 4 Save gryscl [default ON]\nAdv Options: CHANGE COLOR DEPTH 2 colors (B/W) 1 BPP)\n";
## Configuration Data for masking data output
my %config = (
'LZW' => 'colors',
'Lempel-Ziv & Welch encoding' => 'colors',
'CCITT Group 4' => 'bkwhts',
'CCITT Group 4 facsimile encoding' => 'bkwhts',
'None' => 'none',
'none' => 'none',
'RGB color' => 'colors',
'min-is-white' => 'bkwhts',
'min-is-black' => 'bkwhts',
'palette color (RGB from colormap)' => 'colors',
'Resolution' => sub {
my @r = split(/, /, shift);
$r[0] =~ s/\D//g;
$r[1] =~ s/\D//g;
return @r[0,1];
},
);
my @config = keys %config;
#my $file = $infile; # set this as needed.
my $file = "data.txt";
open my $fh, '<', $file or die "can't open <$file> for reading $!";
$/ = "TYPE:\n";
while ( my $record = <$fh> ) {
chomp $record;
next if $record eq '';
$record =~ s/(TIFF Directory at offset .+)\n//;
## Future use, for incrementing errors
my $errorCount = 0;
my ($fullpath, $data) = split(/\n/, $record, 2);
$fullpath =~ s/:$//;
my ($drv, $path, $file) = File::Spec->splitpath($fullpath);
## Start processing the file
print "Processing $file\n";
$fileCount++;
## Get Compression Scheme data
my $cs = $config{$1} if ($data =~ s/\s{2}Compression Scheme:\s+(.*?)\n//);
if (!defined $cs) {
print "[ERROR]: Compression Scheme for $file not found.\n";
#print ERRLOG "[ERROR]: Compression Scheme for $file not found.\n";
$cs = "unknwn";
$errorCount++;
}
## Get Photometric Interpretation data
my $pi = $config{$1} if ($data =~ s/\s{2}Photometric Interpretation:\s+(.*?)\n//);
if (!defined $pi) {
print "[ERROR]: Photometric Interpretation for $file not found.\n";
print ERRLOG "[ERROR]: Photometric Interpretation for $file not found.\n";
$pi = "unknwn";
$errorCount++;
}
## Get Bits/Sample data
my $bits = $1 if ($data =~ s/\s{2}Bits\/Sample:\s+(.*?)\n//);
if (!defined $bits) {
print "[ERROR]: Bits/Sample data for $file not found.\n";
print ERRLOG "[ERROR]: Bits/Sample data for $file not found.\n";
$bits = "unknwn";
$errorCount++;
}
## Get Samples/Pixel data
my $pixels = $1 if ($data =~ s/\s{2}Samples\/Pixel:\s+(.*?)\n//);
if (!defined $pixels) {
print "[ERROR]: Samples/Pixel data for $file not found.\n";
print ERRLOG "[ERROR]: Samples/Pixel data for $file not found.\n";
$pixels = "unknwn";
$errorCount++;
}
## Get AlphaChnl Value (bits * pixels)
if (!($pixels eq '') && !($bits eq '')) {
if (!($pixels eq "unknwn") && !($bits eq "unknwn")) {
$alphachnl = $bits * $pixels;
if ($alphachnl == 1) {
$alphachnl = "bkwhts";
}
elsif ($alphachnl == 8) {
$alphachnl = "colors";
}
elsif ($alphachnl == 24) {
$alphachnl = "doLOGO";
}
}
}
else {
$alphachnl = "unknwn";
print "[ERROR]: Alpha Channel for $file had issues (probably due to Bits/Sample or Sample/Pixel issue.)\n";
$errorCount++;
print "[ERROR]: Alpha Channel for $file had issues (probably due to Bits/Sample or Sample/Pixel issue.)\n";
}
## Get Resolution data
my @r = $config{'Resolution'}->($1) if ($data =~ s/\s{2}Resolution:\s+(.*?)\n//);
## Get Width/Length data
my ($w, $l) = ($1, $2) if ($data =~ s/\s{2}Image Width: (\d+) Image Length: (\d+)\n//);
## Width
if (!defined $w) {
print "[ERROR]: Width for $file not found.\n";
print ERRLOG "[ERROR]: Width for $file not found.\n";
$errorCount++;
#next;
}
## Length
if (!defined $l) {
print "[ERROR]: Length for $file not found.\n";
print ERRLOG "[ERROR]: Length for $file not found.\n";
$errorCount++;
#next;
}
## Width
if (!defined $w) {
print "[ERROR]: Width for $file not found.\n";
print ERRLOG "[ERROR]: Width for $file not found.\n";
$errorCount++;
}
## Length
if (!defined $l) {
print "[ERROR]: Length for $file not found.\n";
print ERRLOG "[ERROR]: Length for $file not found.\n";
$errorCount++;
$l = "unknwn";
}
## Resolution
if (!defined $r[0] || !defined $r[1]) {
print "[ERROR]: Resolution for $file not found.\n";
print ERRLOG "[ERROR]: Resolution for $file not found.\n";
$errorCount++;
#next;
}
## Resolution
if (!defined $r[0] || !defined $r[1]) {
print "[ERROR]: Resolution for $file not found.\n";
print ERRLOG "[ERROR]: Resolution for $file not found.\n";
$errorCount++;
$r[0] = "unknwn";
$r[1] = "unknwn";
}
## Get Rows/Strip data
my $strip = $1 if ($data =~ s/\s{2}Rows\/Strip:\s+(.*?)\n//);
if (!defined $strip) {
print "[ERROR]: Rows/Strip data for $file not found.\n";
print ERRLOG "[ERROR]: Rows/Strip data for $file not found.\n";
$errorCount++;
}
## Get Size of TIF(F) file(s)
#my $filesize = (-s $fullpath) / (1024 * 1024); ## Uncomment when in production
my $filesize = "2"; ## REMOVE - Testing Purposes only to "fake" an image size.
my $size_in_mb = sprintf "%.2f", $filesize;
## Error Check
if ($errorCount == 8) {
print "[FAILURE]: Not processed, image may be CORRUPT.\n";
print CORRUPT "$file;High Probability - IMAGE CORRUPT.";
$totalErrors++;
next;
}
if ($pixels eq "unknwn" && $bits eq "unknwn") {
print "[INFO]: Specially processed image.\n";
print SPECIAL "$file;Smpl/Pix & Bits/Smpl are missing.\n";
$totalErrors++;
next;
}
if ($errorCount > 0) {
print "[ERROR]: $file was not processed, too many errors.\n";
$totalErrors++;
next;
}
$data =~ s/\n$//;
## ** For Debugging - Prints To Screen **
## print $/, join(':', $file, $cs, $bits, $pi, $w, $l, @r, $size_in_mb, "\n"), $data, "\n";
print OUT1 $/, join(';', $file, $cs, $bits, $pixels, $pi, $w, $l, @r, $size_in_mb, "\n"), $data, "\n";
## LA Output
if ($state eq "LA") {
print OUT2 "$file;", "$cs;", "$alphachnl;", "$pi;", "$w;", "$l;", "$r[0];$r[1];;;", "$size_in_mb;;","\'$batch;;;;","start;","$file;;;;;;;;;;","$size_in_mb;","move;","$file;","$dir_root\\done;", "\n";
}
## NM Output
elsif ($state eq "NM") {
print OUT2 "$file;", "$cs;", "$alphachnl;", "$pi;", "$w;", "$l;", "$r[0];$r[1];;;", "$size_in_mb;;","\'$batch;;;;","start;","$file;","$size_in_mb;","move;","$file;","$dir_root\\done;", "\n";
next;
next;
}
## OK/UT Output
elsif ($state eq "OK" || $state eq "UT") {
print OUT2 "$file;", "$cs;", "$alphachnl;", "$pi;", "$w;", "$l;", "$r[0];$r[1];;;", "$size_in_mb;;","\'$batch;;;;","start;","$file;","$size_in_mb;","move;","$file;","$dir_root\\done;","start;",$file."f;","move;",$file."f;","$dir_root\\done\\TEMPdone;", "\n";
next;
next;
}
## TX/WY Output
elsif ($state eq "TX" || $state eq "WY") {
print OUT2 "$file;", "$cs;", "$alphachnl;", "$pi;", "$w;", "$l;", "$r[0];$r[1];", "move $dir_root\\$file $dir_root\\$cs\\$file;;", "$size_in_mb;;", "\'$batch;;;","start;", "$dir_root\\$cs\\$file;", "$file;","$size_in_mb;","move;", "$dir_root\\$cs\\$file;", "$dir_root\\done;","start;", $file."f;", "move;", $file."f;", "$dir_root\\done\\TEMPdone;", "\n";
next;
next;
}
elsif ($state eq "NONE" || $state eq "--" || $state eq "OTHER") {
print OUT2 "$file;", "$cs;", "$alphachnl;", "$pi;", "$w;", "$l;", "$r[0];$r[1];", "$size_in_mb\n";
next;
next;
}
}
print "\nTotal Files Processed: $fileCount\n";
print "High Probability Failures: $totalErrors / Failure Rate: ".$totalErrors * 100 / $fileCount."%\n";
close (OUT1) or die "Can't close out1: $!";
close (OUT2) or die "Can't close out2: $!";
close (ERRLOG) or die "Can't close error log: $!";
close (CORRUPT) or die "Can't close corrupt log: $!";
close (SPECIAL) or die "Can't close corrupt log: $!";
close ($fh) or die "Can't close $fh: $!";
$errorlog = "\!errors.log";
if (-s $errorlog == 0) {
unlink($errorlog) or die "Can't delete $errorlog : $!";
}
else { print "Error log saved.\n\n"; }
#$corrupt = "\!corrupt.log";
#if (-s $corrupt == 0) {
# unlink($corrupt) or die "Can't delete $corrupt : $!";
#}
#else { print "Corrupt log saved."; }
#$specialLog = "\!specialprocessing.log";
#if (-s $specialLog == 0) {
# unlink($specialLog) or die "Can't delete $specialLog : $!";
#}
#else { print "Special Processing log saved."; }
## Starting Tiffinfo Processing:
my $spcl_dir = "dst";
my $spcl_log = "!specialprocessing.log";
print "DIR_ROOT: $dir_root\n";
print "SPCL_LOG: $spcl_log\n";
print "TIFFINFO_PATH: $tiffinfo_path\n";
sub get_files_list
{
my($log) = @_;
open my $file, '<', $log or croak "Couldn't open $log: $!\n";
# Skip heading lines
for (my $i = 0 ; $i < 5 ; $i++)
{
my $dummy = <$file>;
}
my @files;
while (<$file>)
{
my (@fields) = split /;/;
my $filename = $fields[0];
push @files, $filename;
}
close $file or croak "Couldn't close $log: $!\n";
return @files;
}
my @spcl_files = get_files_list($spcl_log);
print "\n$spcl_log\n"; # delete me
## Copy original files
print "\nStarting the copy process over to $spcl_dir:\n";
foreach my $filename (@spcl_files)
{
print "Copying $filename";
if (copy("$dir_root/$filename", "$spcl_dir/$filename"))
{
print " - Success!\n";
}
else
{
print " - Failure! ($!)\n";
}
}
## Confirmation of file copy
print "Everything look OK?: ";
chomp(my $confirmcopy = <STDIN>);
if ($confirmcopy !~ /^y|^yes/i )
{
print "Will do, exiting.\n";
exit 0;
}
## Delete original files
print "\nAttempting to remove original files.\n";
foreach my $filename (@spcl_files)
{
print "Attempting to remove: $filename";
if (unlink("$dir_root/$filename"))
{
print " - Success!\n";
}
else
{
print " - Failure! ($!)\n";
}
}
## Conversion process
print "\nAttempting to convert the files.\n";
foreach my $filename (@spcl_files)
{
print "Starting conversion on $filename\n";
my @args = ("$tiffinfo_path", "$spcl_dir/$filename", "/bpp=2",
"/tifc=4", "/convert=$dir_root/$filename",
"/killmesoftly", "/silent");
if (system(@args) != 0)
{
carp "Failed to convert $filename ($!)";
}
else
{
unlink("$spcl_dir/$filename") or carp "Failed to unlink $spcl_dir/$filename ($!)";
}
}
ПРИМЕЧАНИЯ:
Единственное, что я изменил, я добавил:
print "DIR_ROOT: $dir_root\n";
print "SPCL_LOG: $spcl_log\n";
print "TIFFINFO_PATH: $tiffinfo_path\n";
... для целей отладки. И еще одно, что я переименовал массив @files
в @spcl_files
, так как @files
уже было определено в моем основном скрипте.
ВСЕ ЕЩЕ ПРОБЛЕМА :
Вот мой текущий вывод:
Irfanview Found.
Where are your TIF file(s) located? (C:\directory\of\your\tiff\files): c:\dad\ti
ffs
State: [LA,NM,OK,UT,TX,WY] - [--,none,other]: tx
Status [nr][hs][tye] or Anything Descriptive: nr
Batch #? 1
Attempting to execute .bat script now...
Ran .bat script successfully.
Processing filename.tif
Processing filename2.tif
[ERROR]: Bits/Sample data for filename2.tif not found.
[ERROR]: Samples/Pixel data for filename2.tif not found.
[INFO]: Specially processed image.
Total Files Processed: 2
High Probability Failures: 1 / Failure Rate: 50%
Error log saved.
DIR_ROOT: c:\dad\tiffs
SPCL_LOG: !specialprocessing.log
TIFFINFO_PATH: ./converter.pl
!specialprocessing.log
Starting the copy process over to dst:
Everything look OK?: n
Что касается статтеров, он по-прежнему не показывает имя файла после «Начало процесса копирования в dst» и нажимаю ли я Y или N для «Все выглядит нормально?» часть, он просто висит там и ничего не делает.
НОВЫЙ КОД / ВЫХОД 11/26 @ 3PM CST:
my @spcl_files = get_files_list($spcl_log);
print $spcl_files[0];
print "YO";
Выход:
Use of uninitialized value in print at compileTiffInfo.pl line 445.
YO
Starting the copy process over to dst:
Everything look OK?: Terminating on signal SIGINT(2)
Спасибо заранее! :)