Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Perl-Script gibt leere Variable in Datei aus...

Frage Entwicklung Perl

Mitglied: l0c4lhost

l0c4lhost (Level 1) - Jetzt verbinden

24.10.2005, aktualisiert 28.10.2005, 7260 Aufrufe, 11 Kommentare

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!!!

Mit freundlichen Grüßen, 127.0.0.1

<font class="code">#! 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);

  1. sub routinen
sub wanted{
$pos = $File::Find::dir if $_ eq "".$search_var."";
return $pos;
}
</font>
Mitglied: Atti58
25.10.2005 um 08:39 Uhr
... 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.
Bitte warten ..
Mitglied: 11078
25.10.2005 um 09:01 Uhr
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.

<font class="code">
if (!(open(OUTFILE, ">>$ini"))) {
print "Datei konnte nicht geöffnet werden.";
}
</font>

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
Bitte warten ..
Mitglied: Atti58
25.10.2005 um 09:18 Uhr
... 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.
Bitte warten ..
Mitglied: 11078
25.10.2005 um 10:23 Uhr
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...
Bitte warten ..
Mitglied: l0c4lhost
25.10.2005 um 11:36 Uhr
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

Danke für die Hilfe!
Bitte warten ..
Mitglied: 11078
25.10.2005 um 11:44 Uhr
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


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:

<font class="code">
    1. sub routinen
    sub wanted{
    $pos = $File::Find::dir if $_ eq "".$search_var."";
    return $pos;
    }
    </font>

    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:

    <font class="code">
      1. sub routinen
      sub wanted{
      $pos = $File::Find::dir;
      return $pos;
      }
      </font>

      Gruß,
      Tim
Bitte warten ..
Mitglied: Atti58
25.10.2005 um 12:03 Uhr
@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.
Bitte warten ..
Mitglied: 11078
25.10.2005 um 12:48 Uhr
Hi Ho!


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,

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
Bitte warten ..
Mitglied: l0c4lhost
25.10.2005 um 14:25 Uhr
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!
Bitte warten ..
Mitglied: Atti58
25.10.2005 um 14:26 Uhr
@Tim

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

Gruß

Atti.
Bitte warten ..
Mitglied: r00t
28.10.2005 um 14:55 Uhr
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;
        }
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst Leere Array-Werte aus einem Array entfernen (3)

Frage von ToniHo zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch - Datei aus Ordner einlesen mit Ausnahmen! (4)

Frage von Daedrafaction zum Thema Batch & Shell ...

Linux Tools
gelöst CSV-Datei aus mehreren einzelnen Textdateien zusammenbauen in Bash (1)

Frage von Jens4ever zum Thema Linux Tools ...

Batch & Shell
gelöst Dateien mit Powershell löschen und nur leere (symbolische) Datei hinterlassen (6)

Frage von evolution zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...