Perl-Script gibt leere Variable in Datei aus...
Hi, hab hier ein Script, mit dem ich Mozilla-Profil-Dateien lokal auf einen Server kopieren möchte. Das funktioniert auch soweit super, bloss möcht ich mir zum Schluss noch die Variable $pos in eine Datei schreiben lassen, da ich diese noch später für Mozilla brauche. Eigentlich müsste diese Variable beinhalten, wohin der/die Ordner kopiert werden/wurden, als Beispiel K:\Home\Profiles\User. Stattdessen wird aber nix in die Profiles.ini geschrieben Danke für sämtliche geistreiche Ergüsse!!!
MFG, 127.0.0.1
MFG, 127.0.0.1
#! C:\perl\bin\perl.exe -w
use File::Find;
use Win32;
my $user = Win32::LoginName;
my $pos = "";
my $path_home = 'c:/Dokumente und Einstellungen/'.$user.'/Anwendungsdaten/Mozilla/Profiles';
my $path_server_perl = 'K:/Home/Profiles';
my $path_server_win = 'K:\\Home\\Profiles';
my $path_profile;
my $search_var = "bookmarks.html";
my $ini = 'C:/Dokumente und Einstellungen/'.$user.'/Anwendungsdaten/Thunderbird/profiles.ini';
find(\&wanted, ''.$path_server_perl.'');
$pos =~ s/\//\\/g;
if (!(open(OUTFILE, ">>$ini"))) {
print "Datei konnte nicht geöffnet werden.";
}
if (!(open(TEST, "<".$pos."/".$search_var.""))) {
mkdir ($path_server_perl);
system("xcopy \/E \/Y \/V \"".$path_home."\" ".$path_server_win."");
print OUTFILE "Hier die Pfade zum Profil";
}
close TEST;
close OUTFILE;
exit(0);
# sub routinen
sub wanted{
$pos = $File::Find::dir if $_ eq "".$search_var."";
return $pos;
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 18368
Url: https://administrator.de/contentid/18368
Ausgedruckt am: 26.11.2024 um 13:11 Uhr
11 Kommentare
Neuester Kommentar
... wenn Du Zeile 25 änderst in:
print OUTFILE "$pos\n";
wird $pos auch in Deine INI-Datei geschrieben, so ist es jedenfalls bei mr.
Wie programmierst / debuggst Du denn, benutzt Du "PTKDB"? Ich konnet nicht alles nachvollziehen und musste die if(!open(TEST ... - system(... - Anweisungen auskommentieren, denke aber, dass sonst alles richtig ist und eigentlich laufen müsste,
Gruß
Atti.
print OUTFILE "$pos\n";
wird $pos auch in Deine INI-Datei geschrieben, so ist es jedenfalls bei mr.
Wie programmierst / debuggst Du denn, benutzt Du "PTKDB"? Ich konnet nicht alles nachvollziehen und musste die if(!open(TEST ... - system(... - Anweisungen auskommentieren, denke aber, dass sonst alles richtig ist und eigentlich laufen müsste,
Gruß
Atti.
Hallo,
zunächst einmal: finde ich supi, dass noch jemand Perl für Win32 Aufgaben verwendet. Ich habe das früher auch öfter gemacht, meistens in Verbindung mit perlapp aus dem Perl Development Kit von Activestate.
Aber nun zum Problem.
So wie ich das sehe, schreibst Du doch die Variable $pos nirgendwo rein ?! Die Sub &wanted gibt jedenfalls eine richtig zugewiesene $pos aus, das habe ich getestet.
Was Du hier machst, heißt doch in etwa: Wenn die Datei/der Handle Outfile nicht geöffnet ist, dann mach... und das macht es auch: Bei mir wird immer ausgegeben: "Datei konnte nicht geöffnet werden"...weil sie es auch nirgendwo wird!
irgendwo müsste ja mal ein: open(OUTFILE,">>"$ini") kommen, mit der die profiles.ini wirklich mal zum Schreiben geöffnet wird...
Hoffe, das hat geholfen!
Gruß,
Tim
zunächst einmal: finde ich supi, dass noch jemand Perl für Win32 Aufgaben verwendet. Ich habe das früher auch öfter gemacht, meistens in Verbindung mit perlapp aus dem Perl Development Kit von Activestate.
Aber nun zum Problem.
So wie ich das sehe, schreibst Du doch die Variable $pos nirgendwo rein ?! Die Sub &wanted gibt jedenfalls eine richtig zugewiesene $pos aus, das habe ich getestet.
if (!(open(OUTFILE, ">>$ini"))) {
print "Datei konnte nicht geöffnet werden.";
}
Was Du hier machst, heißt doch in etwa: Wenn die Datei/der Handle Outfile nicht geöffnet ist, dann mach... und das macht es auch: Bei mir wird immer ausgegeben: "Datei konnte nicht geöffnet werden"...weil sie es auch nirgendwo wird!
irgendwo müsste ja mal ein: open(OUTFILE,">>"$ini") kommen, mit der die profiles.ini wirklich mal zum Schreiben geöffnet wird...
Hoffe, das hat geholfen!
Gruß,
Tim
... na, so ganz stimmt das nicht, dass er die Variable nicht füllt - Du hast wohl die Subroutine übersehen ...
OUTFILE wird ja nur geöffnet, wenn:
my $ini = 'C:/Dokumente und Einstellungen/'.$user.'/Anwendungsdaten/Thunderbird/profiles.ini';
existiert ...
Aber sonst gebe ich Dir Recht, Perl ist auch heute noch unschlagbar gegenüber BATCH-Programmierung - besonders wenn man ein wenig "Pattern-Matching" kann,
Gruß
Atti.
OUTFILE wird ja nur geöffnet, wenn:
my $ini = 'C:/Dokumente und Einstellungen/'.$user.'/Anwendungsdaten/Thunderbird/profiles.ini';
existiert ...
Aber sonst gebe ich Dir Recht, Perl ist auch heute noch unschlagbar gegenüber BATCH-Programmierung - besonders wenn man ein wenig "Pattern-Matching" kann,
Gruß
Atti.
Hi Atti,
hab doch gar nicht gesagt, dass er die Variable nicht füllt:
[ZITAT]
So wie ich das sehe, schreibst Du doch die Variable $pos nirgendwo rein ?! Die Sub &wanted gibt jedenfalls eine richtig zugewiesene $pos aus, das habe ich getestet.
[/ZITAT]
Aber dennoch richtig: die Datei existierte bei mir auch nicht, deshalb waren für meine Umgebungsverhältnisse die Negation des if-Statements ziemlich fatal (mal ganz davon abgesehen, dass auch der ordner "Thinderbird" bei mir nicht existiert). Wenn man nicht davon ausgehen kann, dass die Datei existiert, müsste man das umschreiben und vorher prüfen.
Wenn ich es mir nochmal anschaue, kann ich also Atti nur zustimmen: Das einzige, was in die ini geschrieben wird ist nach dem Code ganz offensichtlich nur "Hier die Pfade zum Profil". Flüchtigkeitsfehler also.
Gruß,
Tim
P.S.: Eine gute Adresse für Perl ist auch http://www.perlboard.de/ . Werde den Link mal hier eintragen, wenn er noch nicht existiert...
hab doch gar nicht gesagt, dass er die Variable nicht füllt:
[ZITAT]
So wie ich das sehe, schreibst Du doch die Variable $pos nirgendwo rein ?! Die Sub &wanted gibt jedenfalls eine richtig zugewiesene $pos aus, das habe ich getestet.
[/ZITAT]
Aber dennoch richtig: die Datei existierte bei mir auch nicht, deshalb waren für meine Umgebungsverhältnisse die Negation des if-Statements ziemlich fatal (mal ganz davon abgesehen, dass auch der ordner "Thinderbird" bei mir nicht existiert). Wenn man nicht davon ausgehen kann, dass die Datei existiert, müsste man das umschreiben und vorher prüfen.
Wenn ich es mir nochmal anschaue, kann ich also Atti nur zustimmen: Das einzige, was in die ini geschrieben wird ist nach dem Code ganz offensichtlich nur "Hier die Pfade zum Profil". Flüchtigkeitsfehler also.
Gruß,
Tim
P.S.: Eine gute Adresse für Perl ist auch http://www.perlboard.de/ . Werde den Link mal hier eintragen, wenn er noch nicht existiert...
Hallo,
Wie geschrieben, ich habe das Script mal kurz laufen lassen (heute morgen) und bei mir hat $pos einen Inhalt gehabt; glaube aber erst, nachdem ich folgendes Konstrukt, das mir einfach nicht geläufig war, aufgelöst habe:
Dieses if-Statement in der dritten Zeile hab ich nicht wirklich kapiert und konnte mir auch (trotz Ausbleiben einer Fehlermeldung) nicht ganz vorstellen, dass dies so richtig ist. Schreib mal folgendes und sieh nach, ob die Variable dann einen Pfad zurückgibt:
Gruß,
Tim
ch habe die
Vermutung, dass die Variable
$pos leer ist, obwohl
eigentlich der Pfad zu dem Profil drinstehen
müsste!?
Und so langsam gehen mir die Ideen aus
Vermutung, dass die Variable
$pos leer ist, obwohl
eigentlich der Pfad zu dem Profil drinstehen
müsste!?
Und so langsam gehen mir die Ideen aus
Wie geschrieben, ich habe das Script mal kurz laufen lassen (heute morgen) und bei mir hat $pos einen Inhalt gehabt; glaube aber erst, nachdem ich folgendes Konstrukt, das mir einfach nicht geläufig war, aufgelöst habe:
# sub routinen
sub wanted{
$pos = $File::Find::dir if $_ eq "".$search_var."";
return $pos;
}
Dieses if-Statement in der dritten Zeile hab ich nicht wirklich kapiert und konnte mir auch (trotz Ausbleiben einer Fehlermeldung) nicht ganz vorstellen, dass dies so richtig ist. Schreib mal folgendes und sieh nach, ob die Variable dann einen Pfad zurückgibt:
# sub routinen
sub wanted{
$pos = $File::Find::dir;
return $pos;
}
Gruß,
Tim
@tim
Sorry, ich habe Dein Post dann wohl falsch verstanden ...
... bei mir hat das Übergeben der $pos-Variable geklappt (mit leicht veränderten Pfaden natürlich) ...
Mein Erster Gedanke beim Lesen Deines Problems war allerdings die "Gültigkeit von Variablen" - normalerweise gelten Variablen, wenn sie nicht global deklariert wurden, in Subroutinen nicht bzw. haben dort einen anderen Wert. Du kannst ja das Konstrukt:
$pos=&wanted;
im Hauptprogramm benutzen, um die Variable zu füllen
Warum beantwortet man nur meine Fragen nie ? Benutzt Du einen Debugger? Mit PTKDB kann man nämlich schön verfolgen, welchen Weg das Programm geht und welche Werte die Variablen haben,
Gruß
Atti.
Sorry, ich habe Dein Post dann wohl falsch verstanden ...
... bei mir hat das Übergeben der $pos-Variable geklappt (mit leicht veränderten Pfaden natürlich) ...
Mein Erster Gedanke beim Lesen Deines Problems war allerdings die "Gültigkeit von Variablen" - normalerweise gelten Variablen, wenn sie nicht global deklariert wurden, in Subroutinen nicht bzw. haben dort einen anderen Wert. Du kannst ja das Konstrukt:
$pos=&wanted;
im Hauptprogramm benutzen, um die Variable zu füllen
Warum beantwortet man nur meine Fragen nie ? Benutzt Du einen Debugger? Mit PTKDB kann man nämlich schön verfolgen, welchen Weg das Programm geht und welche Werte die Variablen haben,
Gruß
Atti.
Hi Ho!
Den kannte ich noch nicht, sieht aber klasse aus (hab es für den späteren Test mal gebookmarkt)!
Trag den doch mal als Link in diesem Bereich ein!
Gruß,
Tim
Warum beantwortet man nur meine Fragen nie
? Benutzt Du einen Debugger? Mit PTKDB
kann man nämlich schön verfolgen,
welchen Weg das Programm geht und welche
Werte die Variablen haben,
? Benutzt Du einen Debugger? Mit PTKDB
kann man nämlich schön verfolgen,
welchen Weg das Programm geht und welche
Werte die Variablen haben,
Den kannte ich noch nicht, sieht aber klasse aus (hab es für den späteren Test mal gebookmarkt)!
Trag den doch mal als Link in diesem Bereich ein!
Gruß,
Tim
Also ich würde das so lösen
#!/usr/bin/perl -W
use strict;
use warnings;
use File::Find;
use Win32;
my $pos = undef; # Immer mit undef initialisieren; ist schoener.
my $path_home = "C:/Dokumente und Einstellungen/$user/Anwendungsdaten/Mozilla/Profiles";
my $path_server_win = 'K:\\Home\\Profiles';
my $path_profile = undef;
my $search_var = "bookmarks.html";
my $ini = "C:/Dokumente und Einstellungen/$user/Anwendungsdaten/Thunderbird/profiles.ini";
find(\&wanted, $path_server_perl);
mkdir($path_server_perl);
system("xcopy /E /Y /V $path_home $path_server_win");
}
#!/usr/bin/perl -W
use strict;
use warnings;
use File::Find;
use Win32;
- vars
my $pos = undef; # Immer mit undef initialisieren; ist schoener.
my $path_home = "C:/Dokumente und Einstellungen/$user/Anwendungsdaten/Mozilla/Profiles";
- Das hier kann man kuhler machen, man kann den Delimiter bestimmen, frag mich aber nicht, wie das geht.
my $path_server_win = 'K:\\Home\\Profiles';
my $path_profile = undef;
my $search_var = "bookmarks.html";
my $ini = "C:/Dokumente und Einstellungen/$user/Anwendungsdaten/Thunderbird/profiles.ini";
find(\&wanted, $path_server_perl);
- Das hier koenntest du dir sparen, wenn du das mit dem Delimiter machst.
- Ich drehe hier mal die Reihenfolge...
- Hm, ich verstehe hier nicht, was du da machen willst oder machst.
mkdir($path_server_perl);
system("xcopy /E /Y /V $path_home $path_server_win");
}
- Sollte eigentlich prima gehen. Ich verstehe die ganzen Backslashes nicht.
- Hier wuerde ich das einfacher schreiben:
- Mit einem Pfeil (>) wuerde die Datei ueberschrieben. Ich denke, das ist, was du brauchst.
- Ich weiss es aber nicht so genau.
- Mit einem doppeltem Pfeil (>>) waere es ranhaengen.
- Und dann glaube ich, dass du hier Sachen doppelmoppelst. Ich mach' mal, wie ich das denke.
- Jedenfalls schreibst du hier gar nichts in die ini rein.
- So in etwa muesste das aussehen:
- helper apps
- Ich glaube, Find::dir ist hier falsch?
- Du willst doch nach bookmarks.html suchen?
print WRITE_INI "$pos/$search_var";
close WRITE_INI;
exit(0);
#
sub wanted(){
return unless -f $_;
return $pos;
}