perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 24
Click for quality!




11.02.2012 / 21:12

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragPerl 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

-






-
-