Perl Dateien per Windows Batch-Datei ausführen
|
Seitenanfang |
| Hallo, Ich habe folgendes mysteriöses Problem: Ich hab ein kleines Perl Program geschrieben, welches Dateien aus einem Verzeichnis in ein anderes kopiert und die Dateiendung(.txt)an jede Datei hängt. Das funktioniert auch super, wenn ich dieses Perl Programm in dem Verzeichnis durch doppelklicken ausführe. Jetzt hab ich aber den Fall das es sich hierbei und viele Verzeichnisse handelt und da ich nicht für jedes Verzeichniss einen Job im Taskplaner einrichten möchte, wollte ich die einzelnen Perl Scripte in einer Batch Datei nacheinander abarbeiten. Das klappt eigtl auch ganz gut.. die perl Scripte werden nacheinander ausgeführt. Jedoch nicht mit dem Ergebniss wie wenn ich sie manuel aus dem jeweiligen Verzeichnis starten würde, denn die Dateien kommen nicht im Zielordner an. Das Script wird zwar ausgeführt, dennoch sind meine modifizierten Dateien nirgends zu finden.. Die Batch Datei enthält folgendes: start /W D:\CL150\perlscript.pl start /W D:\INDEX\perlscript.pl start /W D:\Md3\perlscript.pl usw. Hat jemand eine Idee??
Datum: 26.10.2006-15:53

|
re: Perl Dateien per Windows Batch-Datei ausführen
|
Seitenanfang |
| poste mal etwas Code? Wie liest Du die Dateien in? Wie schreibst Du sie in den Zielordner? Wenn Du relative Pfadangaben benutzt, dann liegt hier der Fehler... Dann musst Du aus relativen Pfaden absolute Pfade machen. (z.B. mit FindBin)...
Datum: 26.10.2006-16:15

|
re: Perl Dateien per Windows Batch-Datei ausführen
|
Seitenanfang |
| Hier mein Code: #!/usr/bin/perl -w use strict; use FindBin qw($Bin); use lib "$Bin/../lib"; use File::Copy; #aktuellen Pfad rausbekommen my $Fullpath = $Bin; #Bei jedem Slash splitten my @Teile = split(/\//,$Fullpath); #Anzahl Splits my $Anzahl = @Teile; #Vorletzter Ordnername my $dir1 = $Teile[$Anzahl-2]; #Letzer Ordnername my $dir2 = $Teile[$Anzahl-1]; #Dateien auslesen opendir DIR, $Fullpath or die $!; my @files = readdir DIR; closedir DIR; my $Zielverz = "d:/maschinendaten/Datentext"; foreach(@files) { if (!-e "$Zielverz/$dir1/$dir2/$_") { mkdir("$Zielverz") unless (-e "DatenText"); mkdir("$Zielverz/$dir1") unless (-e "$dir1"); mkdir("$Zielverz/$dir1/$dir2") unless (-e "$dir2"); copy($_, $Zielverz."/".$dir1."/".$dir2."/".$_.".txt"); } else { print "Datei: $_ Existiert schon\n"; } } print "\n Ordner \n$dir2 ist\n"; print "fertig!!!\n"; Ich hab hab relative Pfade sowie auch absolute versucht mit selbem Ergebniss. Beim manuellen Ausführen klappts, aber per Batch Datei nicht.:( Wo steckt da der Wurm drin?
Datum: 26.10.2006-17:16

|
re: Perl Dateien per Windows Batch-Datei ausführen
|
Seitenanfang |
| Hallo, ich würde das Problem anders lösen. Anstatt in jedem Quellverzeichnis ein Perlscript abzulegen, würde ich EIN Script verwenden und eine Textdatei in der die zu sichernden Verzeichnisnamen (inkl. Pfad) stehen. Das macht die Sache auch einfacher, wenn du mal Änderungen im Script vornehmen must ;-) Hier eine mögliche Lösung: #!c:\perl\bin\perl.exe -w use strict; # Variablen fuer das Zielverzeichnis my $zielpfad = "d:\\maschinendaten\\Datentext"; my $zieldir; # lese Datei mit Pfadangaben der zu sichernden Ordner open(IN,"<data.txt"); my @pathes = <IN>; close IN; # durchlaufe alle angegeben Pfadangaben foreach my $dir ( @pathes ){ chomp( $dir ); # ueberspringe leere bzw. Kommentarzeilen next if( $dir =~ /^#|^\s$/ ); # pruefe ob das Verzeichnis existiert if( ! -d $dir ){ print "$dir existiert nicht oder ist kein Verzeichnis\n"; next; } else { # lege ein Unterverzeichnis im Zielordner an, mit dem Namen # des Quellordners $dir =~ /.*\\([^\\]*)$/; $zieldir = $1; print "erstelle Verzeichnis: $zielpfad\\$zieldir\n"; system("mkdir $zielpfad\\$zieldir"); } # lese den Inhalt des Verzeichnisses opendir(DIR,$dir); my @content = readdir(DIR); closedir(DIR); # durchlaufe den Inhalt des Verzeichnisses foreach my $file ( @content ){ # ueberspringe Verzeichnisnamen next if( -d "$dir\\$file" ); if( -f "$zielpfad\\$zieldir\\$file.txt" ){ # Warnung, wenn Zielatei existiert print "$dir\\$file.txt besteht bereits\n"; next; } else { # wenn die Zieldatei noch nicht existiert, wird kopiert... print "Kopiere $dir\\$file nach $zielpfad\\$zieldir\\$file.txt\n"; system("copy $dir\\$file $zielpfad\\$zieldir\\$file.txt"); } } } Und dazu jetzt noch ein File namens "data.txt" wo z.B. "C:\Temp" drin steht... Gruß TommyB
Datum: 27.10.2006-10:04

|
re: Perl Dateien per Windows Batch-Datei ausführen
|
Seitenanfang |
| Zum Kopieren der Dateien würde ich File::Copy nehmen. Und ich würde mal Fehlerabfragen einbauen...
Datum: 27.10.2006-13:29

|
re: Perl Dateien per Windows Batch-Datei ausführen
|
Seitenanfang |
Sehr schön, Danke. Hat sofort funktiert. Eine Änderung bräuchte ich aber noch, und zwar sollen die Dateien auch kopiert werden wenn Sie schon existieren aber sich geändert haben.Diese Abfrage hab ich raus genommen: if( -f "$zielpfad\\$zieldir\\$file.txt" ){ # Warnung, wenn Zielatei existiert print "$dir\\$file.txt besteht bereits\n"; und jetzt bräuchte ich sowas wie nur geänderte und neue Dateien schreiben. Gibt es da einen Parameter für system("copy $quelle $ziel"); ähnlich wie für das DOS Komando: xcopy /D Hab schon gegoogled, aber leider nichts gefunden..
Datum: 27.10.2006-13:45

|
re: Perl Dateien per Windows Batch-Datei ausführen
|
Seitenanfang |
Danke auch. Ich benutzte jetzt File::Copy geht schneller irgendwie...Was für Fehlerabfragen würdest du denn einbauen?
Datum: 27.10.2006-14:02

|