l0c4lhost
Goto Top

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 face-sad Danke für sämtliche geistreiche Ergüsse!!!

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;
}

Content-Key: 18368

Url: https://administrator.de/contentid/18368

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: Atti58
Atti58 25.10.2005 um 08:39:37 Uhr
Goto Top
... 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.
Mitglied: 11078
11078 25.10.2005 um 09:01:19 Uhr
Goto Top
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.

 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
Mitglied: Atti58
Atti58 25.10.2005 um 09:18:19 Uhr
Goto Top
... na, so ganz stimmt das nicht, dass er die Variable nicht füllt - Du hast wohl die Subroutine übersehen face-wink ...

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.
Mitglied: 11078
11078 25.10.2005 um 10:23:40 Uhr
Goto Top
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]

face-smile

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...
Mitglied: l0c4lhost
l0c4lhost 25.10.2005 um 11:36:46 Uhr
Goto Top
Hallo,

erstmal danke für die rege Beteiligung an meinem Problem!!!

Wie beim ersten Comment beschrieben, habe ich Zeile 25 in print OUTFILE "$pos \n"; geändert. Beim Script-Ablauf hat sich aber leider nichts geändert. In der Profiles.ini wird durch das \n nur eine Leerzeile eingefügt. Ich 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 face-sad

Danke für die Hilfe!
Mitglied: 11078
11078 25.10.2005 um 11:44:41 Uhr
Goto Top
Hallo,


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 face-sad


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
Mitglied: Atti58
Atti58 25.10.2005 um 12:03:35 Uhr
Goto Top
@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 face-wink? 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.
Mitglied: 11078
11078 25.10.2005 um 12:48:04 Uhr
Goto Top
Hi Ho!


Warum beantwortet man nur meine Fragen nie
face-wink? 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
Mitglied: l0c4lhost
l0c4lhost 25.10.2005 um 14:25:43 Uhr
Goto Top
Oh, sry, die Frage nach dem Debugger/Programm, mit dem ich scripte, hab ich total vergessen. Ich nehme Notepad2. Mit dem kam ich eigentlich bisher immer hin, werd mir aber trotzdem mal PTKDB anschauen.
Den Lösungsvorschlag hab ich jetzt noch nicht ausprobiert, werd ich aber noch machen und euch davon berichten. THX!
Mitglied: Atti58
Atti58 25.10.2005 um 14:26:32 Uhr
Goto Top
@tim

... Link ist vorgeschlagen, jetzt muss Frank Scholl nur noch sehen, ob er ihn verwenden darf,

Gruß

Atti.
Mitglied: r00t
r00t 28.10.2005 um 14:55:23 Uhr
Goto Top
Also ich würde das so lösen

#!/usr/bin/perl -W

use strict;
use warnings;

use File::Find;
use Win32;

  1. vars
my $user = Win32::LoginName;
my $pos = undef; # Immer mit undef initialisieren; ist schoener.
my $path_home = "C:/Dokumente und Einstellungen/$user/Anwendungsdaten/Mozilla/Profiles";

  1. Das hier kann man kuhler machen, man kann den Delimiter bestimmen, frag mich aber nicht, wie das geht.
my $path_server_perl = 'K:/Home/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);

  1. Das hier koenntest du dir sparen, wenn du das mit dem Delimiter machst.
$pos =~ s/\//\\/g;

  1. Ich drehe hier mal die Reihenfolge...
  2. Hm, ich verstehe hier nicht, was du da machen willst oder machst.
if(! -d $path_server_perl){
mkdir($path_server_perl);
system("xcopy /E /Y /V $path_home $path_server_win");
}
  1. Sollte eigentlich prima gehen. Ich verstehe die ganzen Backslashes nicht.

  1. Hier wuerde ich das einfacher schreiben:
          1. Mit einem Pfeil (>) wuerde die Datei ueberschrieben. Ich denke, das ist, was du brauchst.
          2. Ich weiss es aber nicht so genau.
          3. Mit einem doppeltem Pfeil (>>) waere es ranhaengen.

          1. Und dann glaube ich, dass du hier Sachen doppelmoppelst. Ich mach' mal, wie ich das denke.

                  1. Jedenfalls schreibst du hier gar nichts in die ini rein.
                  2. So in etwa muesste das aussehen:
          open(WRITE_INI, ">$ini") or warn "Could not open file $ini: $!"; # sprechende Fehler Benutzen! ($!)
          print WRITE_INI "$pos/$search_var";
          close WRITE_INI;

          exit(0);

          #
          1. helper apps
          #
          sub wanted(){
          return unless -f $_;
                  1. Ich glaube, Find::dir ist hier falsch?
                  2. Du willst doch nach bookmarks.html suchen?
          $pos = $File::Find::dir;
          return $pos;
          }