Thomas: Script geht nicht, windows Registry überprüfen! Please Help!!!

Hi,
also irgendwie geht das script einfach nicht(hoffe mein Denkansatz war richtig!).
Das Script soll Registrykeys aus ner TXT auslesen und überprüfen ob die vorhanden sind, danach in ne andere TXT reinschreiben...Hoffentlich könnt ihr mir helfen.Danke schon mal!
Hier das Script:
use Win32::TieRegistry( Delimiter=>"/" );
open (DATEI, "<data.txt");     # vorhandene TXT mit registry Einträgen
@datei = <DATEI>;
close (DATEI);
open (DATEINEU, ">results.txt");    # TXT in der reinschreibt ob der Key vorhanden ist(verzeichnis)
foreach (@datei)
{
        (@p1) = (//, $_);    # liest den Pfad aus der data.txt
        undef (@p1[@p1-2]);
        $pfadname = join ("", @p1);
        print "Pfadname: $pfadname\n";
        chomp ($_);
        }

$zaehler = 0;      # setzt den zähler auf null
foreach $k (keys %vals) {    # foreach schleife -> jeder RegistryWert wird angepackt
$key = $vals{$k};     # Registrywert wird in $key geschrieben
 chomp ($k);
 if $key = $_[$zaehler]    # Wenn Registrywert mit nem Wert aus Textfile übereinstimmt...
 {

print DATEINEU "Eintrag $_ \t\t/ \t vorhanden.\n";
 }
 else
        {
                print DATEINEU "Eintrag $_ \t\t/ \t nicht vorhanden.\n";
        }
 $zaehler ++;     # Zaehler +1

  1. Hi,

    also irgendwie geht das script einfach nicht(hoffe mein Denkansatz war richtig!).

    "geht nicht" geht nicht. Fehlerbeschreibung, bitte.

    Cheatah

    1. Hoi Cheatah,

      "geht nicht" geht nicht. Fehlerbeschreibung, bitte.

      Also, dieses 'geht nicht' ist sehr offensichtlich ;-) Das Script kann
      so niemals laufen. Das sind alleine schon bestimmt 10 syntaktische
      Fehler...

      Gruesse aus mnbeeu,
       c.j.k

      1. Hi,

        Also, dieses 'geht nicht' ist sehr offensichtlich ;-) Das Script kann
        so niemals laufen. Das sind alleine schon bestimmt 10 syntaktische
        Fehler...

        wenn ich keine Fehlerbeschreibung sehe, mache ich mir gar nicht erst die Mühe, das Script anzugucken. Ich mag zwar Nadeln und Heuhaufen, aber nicht am selben Ort.

        Cheatah

        1. wenn ich keine Fehlerbeschreibung sehe, mache ich mir gar nicht erst die Mühe, das Script anzugucken. Ich mag zwar Nadeln und Heuhaufen, aber nicht am selben Ort.

          Cheatah

          Naja also ich bin ein absulut hoffnungsloser Fall hier die Fehlermeldung:

          syntax error at: C:\uebung01\regedit_search.pl line 38, near "if $key"
          syntax error at: C:\uebung01\regedit_search.pl line 43, near "else"
          Execution of C:\uebung01\regedit_search.pl aborted due to compilation errors.

          naja kein wunder bei meinem Kauderwasch...

          1. Hi,

            Naja also ich bin ein absulut hoffnungsloser Fall

            nur, wenn Du es selbst glaubst.

            hier die Fehlermeldung:

            Schaue im Code etwas davor und danach, was Perl an der Syntax auszusetzen haben könnte. Die Doku hilft Dir, die Details auszuarbeiten. Vergiss nicht, die Shebang auf "...perl -w" enden zu lassen, damit auch die potentiellen Fehler zu einer entsprechenden Meldung führen, nicht nur die offensichtlichen.

            syntax error at: C:\uebung01\regedit_search.pl line 38, near "if $key"

            Oftmals fehlen einfach nur Klammern... und bei ungewöhnlichen Ergebnissen solltest Du bedenken, dass die _Zuweisung_ "$key = $_[$zaehler]" vermutlich klappt, im Gegensatz zu einer Gleichheitsprüfung, die einen anderen Operator hat als "=".

            naja kein wunder bei meinem Kauderwasch...

            Och, typische Anfängerfehler. Wenn Du begriffen hast, woran die liegen, und Dich zu perldoc perlstyle hochgearbeitet hast, bist Du 'ne Stufe weiter.

            Cheatah

            1. So also in Zukunft werd ich Euch wenn überhaupt noch mit hoffentlich ganz kleinen Sachen nerven, da ich jetzt wieder von vorne anfang und das script erstmal bei Seite lege bis ich die Klasse hab um so was selbst zu coden ;-)!
              Bis dahin Danke nochmal an alle Beteiligten und viel Spass!

              Gruß Thomas

              1. Hi,

                So also in Zukunft werd ich Euch wenn überhaupt noch mit hoffentlich ganz kleinen Sachen nerven, da ich jetzt wieder von vorne anfang und das script erstmal bei Seite lege bis ich die Klasse hab um so was selbst zu coden ;-)!

                die Klasse kriegst Du nur, wenn Du versuchst, sowas selbst zu machen. Wenn es nicht klappt: 1.) Doku, 2.) sonstige Recherche, 3.) fragen. Wenn Du etwas nicht verstehst: dito. Wenn Du mehr über etwas erfahren willst: auch.

                Ohne Praxis wird man jedenfalls nie Theoretiker :-)

                Cheatah

              2. Hi Thomas,

                So also in Zukunft werd ich Euch wenn überhaupt noch mit
                hoffentlich ganz kleinen Sachen nerven

                ganz im Gegenteil: Die "ganz kleinen" Sachen findest Du alle durch einen Blick in die Dokumentation (den Dir keiner abnehmen wollen wird ;-).

                Dagegen sind die "großen" Sachen, also die Diskussionen über die richtige Art und Weise, an ein konkretes Problem heranzugehen, die eigentlich interessanten Threads in diesem Forum.
                Je früher im Design-Prozeß Du andere mitlesen läßt, um so weniger wahrscheinlich rennst Du in Sackgassen. Die Codierung, also den letzen Teil der Realisierung, kannst Du meistens alleine erledigen - mit angemessener Benutzung der verfügbaren Informations-Ressourcen.

                Viele Grüße
                      Michael

                1. Hi,

                  ganz im Gegenteil: Die "ganz kleinen" Sachen findest Du alle durch einen Blick in die Dokumentation

                  oft sind die ganz kleinen Sachen die, nach deren Lösung man sich an den Kopf patscht (vermutlich, um die Konsistenz des Holzes zu validieren) oder in die Tischkante beißt.

                  (den Dir keiner abnehmen wollen wird ;-).

                  Das ist richtig - bei eben diesen Dingen fehlt aber gewöhnlich nur der Hinweis, _welche_ Doku die Lösung beinhaltet :-)

                  Dagegen sind die "großen" Sachen, also die Diskussionen über die richtige Art und Weise, an ein konkretes Problem heranzugehen, die eigentlich interessanten Threads in diesem Forum.

                  Große Sachen sind aber auch die, auf die die Antwort "Teile das Problem in Teilprobleme auf. Löse sie." lautet ;-)

                  Je früher im Design-Prozeß Du andere mitlesen läßt, um so weniger wahrscheinlich rennst Du in Sackgassen.

                  ACK. Ich würde mir mehr Artikel der Art "Ich habe mich zu folgender Lösung durchgerungen, was meint ihr dazu?" oder "Dieser Lösungsweg scheint mir im Vergleich zu jenem auch nicht besser zu sein." wünschen. Oft sind es Meinungsfragen - genauso oft kann man mit Expertenkenntnissen, von denen dann alle profitieren, auch ganz klare Entscheidungsrichtlinien nennen.

                  Cheatah

  2. Hallo,

    also irgendwie geht das script einfach nicht

    Das kann ich mir denken, sieht ziemlich abenteuerlich aus;-)

    So wie ich sehe, hast Du Dir die Dokumentation des Moduls nicht gründlich genug angesehen.
    Hier ein einfaches Beispiel, das überprüft, ob jemals der Apache-Server installiert wurde:
    <sample>
    #!c:/perl/bin/perl -w

    use strict;
    use Win32::TieRegistry( Delimiter=>'/');
    print "Apache ist da\n" if($Registry->{'HKEY_LOCAL_MACHINE/Software/Apache Group/Apache'});
    </sample>

    Du siehst, eighentlich ist es recht einfach. Du bindest das Modul ein,  hier mit dem Delimiter '/'. Danach steht Deinem Script die Registry über die Referenz $Registry zur Verfügung.

    Du hast uns zwar den Inhalt der Datei 'data.txt' vorenthalten, aber wenn da irgendwas drinsteht, das wie 'HKEY_LOCAL_MACHINE/Software/Apache Group/Apache' aussieht, dann hast Du eigentlich schon gewonnen.

    Du mußt jetzt nur noch die Datei einlesen, in jeder Zeile die Zeilenumbrüche entfernen, und nachsehen, ob $Registry->{$zeile} existiert, so wie ich es oben mit dem Schlüssel für Apache gemacht habe.

    open (DATEI, "<data.txt");     # vorhandene TXT mit registry Einträgen

    Zugriffe auf externe Resourcen, wie z.B. Dateien, sollten immer auf Erfolg überprüft werden. Also
    open(...) or die 'ups, daneben gegangen: '.$!;

    @datei = <DATEI>;

    Ich weiß nicht woher es kommt, daß jeder immer gleich die ganze Datei einliest. Oft genügt ein
    while(<DATEI>)
       {
       # mach was mit $_
       }

    close (DATEI);

    close(DATEI) or die "verd... die Datei zumachen hat irgendwie nicht geklappt:'.$!;

    foreach (@datei)
    {
            (@p1) = (//, $_);    # liest den Pfad aus der data.txt
            undef (@p1[@p1-2]);
            $pfadname = join ("", @p1);
            print "Pfadname: $pfadname\n";
            chomp ($_);
            }

    Was da genau abläuft will ich, glaube ich, gar nicht wissen:-)
    Was soll z.B. das chomp, wenn $_ sowieso gleich wieder überschrieben wird.
    Außerdem solltest Du an Deiner Code-Formatierung arbeiten. Deine Einrückungen machen es (vor allem Dir) wirklich schwer, die Struktur des Codes zu erkennen.

    $zaehler = 0;      # setzt den zähler auf null

    use strict und my hat noch nie geschadet...

    foreach $k (keys %vals) {

    ... Dann hättest Du wahrscheinlich gleich festgestellt, daß es kein Hash namens %vals gibt.

    Den Rest lasse ich einmal unkommentiert und komme lieber zu

    (hoffe mein Denkansatz war richtig!)

    'Das glaube ich nicht, Tim';-)

    Grüße
       Klaus

    1. Maý Thx Klaus!
      Irgendwie denke ich zu kompleziert...
      Naja mir liegt Perl einfach nicht (bzw. Coden...)
      Danke für dein Beispiel!
      ps:
      Danke das ihr so schnell geantwortet habt, leider mach ich viele Fehler weil ich einfach keinen hab der mir Perl beibringen kann bzw. fragen kann wie ein guter Stiel in Perl auszusehen hat.
      Hab hier nur ein fetten Schinke mit 1000Seiten naja nochmal danke!
      So werd ich ´s hoffe hinbekommen!

      Gruß Thomas

      1. Hi,

        ich einfach keinen hab der mir Perl beibringen kann bzw. fragen kann wie ein guter Stiel in Perl auszusehen hat.

        reicht Dir die Doku nicht?

        perldoc perlstyle

        ist gerade für Stilfragen beispielsweise ein guter Anfang.

        Hab hier nur ein fetten Schinke mit 1000Seiten

        Die Doku ist länger ;-) Welcher Schinken ist es denn?

        Cheatah

        1. Die Doku ist länger ;-) Welcher Schinken ist es denn?

          hab ihn grad ne da hat der andere Azubi mein Kumpel ausgeliehen...der will sein Glück auch mal versuchen...

          Thomas

          1. Hi,

            Die Doku ist länger ;-) Welcher Schinken ist es denn?
            hab ihn grad ne da

            ist er von O'Reilly, sprich: Hat er ein Tier auf dem (ansonsten weißen) Cover? Dann ist es nämlich Parma-Schinken. Andernfalls riecht es nach Pressfleisch-Imitat...

            Cheatah

            1. Hi,

              Die Doku ist länger ;-) Welcher Schinken ist es denn?
              hab ihn grad ne da

              ist er von O'Reilly, sprich: Hat er ein Tier auf dem (ansonsten weißen) Cover?

              Ja irgend so ein grünes Fiech is da glaub drauf...naja ich denke ich muss mal nochmal von Anfang an mit Perl anfangen und alles ganz schön langsam und konsequent durchmachen...

              Naja mein Chef gibt mir gleich so behinderte Aufgaben da hab ich natürlich versucht das irgendwie hin zu bekommen!

      2. Hallo,

        Irgendwie denke ich zu kompleziert...

        Anscheinend;-)
        Die von Dir beschriebene Aufgabe könnte IMHO so gelöst werden:

        #!c:/perl/bin/perl -w

        use strict; # Selbstkasteiung, um allfällige Fehler schnell zu sehen
        use Win32::TieRegistry( Delimiter=>'/'); # das gewünschte Modul einbinden
        open(IN,"data.txt") or die 'kann data.txt nicht oeffnen'.$!;
        open(OUT,">results.txt") or die 'kann results.txt nicht oeffnen'.$!;
        while(<IN>) # Zeilenweise einlesen (Zeile stehet in $_)
           {
           chomp; # Zeilenumbruch entfernen
           print OUT "$_ ist " . $Registry->{$_}?'':'nicht' . "vorhanden\n" ; # [1]
           }
        close(IN) or die 'kann data.txt nicht schliessen'.$!;
        close(OUT) or die 'kann results.txt nicht schliessen'.$!;

        [1] Das ist etwas tricky, aber nicht sehr.
        Es gibt die Möglichkeit, einfach Wahr-Falsch-Bedingungen zu überprüfen. Das erfolgt mit BEDINGUNG?WAHR-ERGEBNIS:FALSCH-ERGEBNIS.
        Hier wird einfach, wenn der Registryeintrag existiert, nichts ausgegeben, sonst das Wort 'nicht'. Hmm, etwas verquer ausgedrückt, aber mir fällt momentan nichts besseres ein.

        Naja mir liegt Perl einfach nicht (bzw. Coden...)

        Nur intensives Üben bringt den Erfolg.
        Und versuche, Dir anfangs leichte Aufgaben zu stellen, sonst verzweifelst Du leicht. Das gilt übrigens für jede Programmiersprache.

        Danke für dein Beispiel!

        Bidde schön.

        leider mach ich viele Fehler

        Macht ja nichts, Fehler kann man korrigieren. Und außerdem lernt man nur aus selbigen.

        weil ich einfach keinen hab der mir Perl beibringen kann bzw. fragen kann wie ein guter Stiel in Perl auszusehen hat.

        Die Dokumentation ist eigentlich recht gut, allerdings habe ich den Eindruck, daß sie etwas zu sehr für erfahrene Programmierer ist, die schon wissen, was sie tun, und nur mehr wissen wollen, wie sie es mit Perl tun können.

        Hab hier nur ein fetten Schinke mit 1000Seiten naja nochmal danke!

        Dann weißt Du ja schon etwas mit den nächsten Abenden anzufangen;-)

        So werd ich ´s hoffe hinbekommen!

        Aber klar doch, und uns kannst Du immerhin auch noch fragen.

        Grüße
          Klaus

        1. [1] Das ist etwas tricky, aber nicht sehr.
          Es gibt die Möglichkeit, einfach Wahr-Falsch-Bedingungen zu überprüfen. Das erfolgt mit BEDINGUNG?WAHR-ERGEBNIS:FALSCH-ERGEBNIS.
          Hier wird einfach, wenn der Registryeintrag existiert, nichts ausgegeben, sonst das Wort 'nicht'. Hmm, etwas verquer ausgedrückt, aber mir fällt momentan nichts besseres ein.

          Wäre froh wenn mir überhaupt so was einfallen würde *g*!

          Aber klar doch, und uns kannst Du immerhin auch noch fragen.

          Naja will euch Cracks ja nicht mit meinem Grimschgramsch langweilen...

          ps:hab den Code mal kopiert aber irgendwie schreibt der bei mit nix in die results.txt?!

          Gruß
          Thomas

          1. Hi,

            Aber klar doch, und uns kannst Du immerhin auch noch fragen.
            Naja will euch Cracks ja nicht mit meinem Grimschgramsch langweilen...

            warum denn nicht? Wir langweilen Dich dafür mit Hinweisen auf die Doku ;-)

            ps:hab den Code mal kopiert aber irgendwie schreibt der bei mit nix in die results.txt?!

            Abgesehen davon, dass Klaus schon weiß, wovon er spricht: Übernimm _niemals_ Code, den Du nicht verstanden hast. Es kann viel zu viel darin passieren - und sei es nur, weil bei Dir die Rahmenbedingungen ein wenig anders sind, als es sich der Schreiber dachte. Das Ergebnis können problemlos irreversible Datenverluste sein.

            Cheatah

            P.S.: Das Problem sehe ich in fehlender Klammersetzung um dem "?:"-Konstrukt.

            1. Hallo,

              Abgesehen davon, dass Klaus schon weiß, wovon er spricht: ...
              P.S.: Das Problem sehe ich in fehlender Klammersetzung um dem "?:"-Konstrukt.

              @Cheatah:
              Na ja, wenn mir solche Schnitzer passieren, dann bin ich mir nicht so sicher, ob ich immer weiß, was ich da tue:-((

              Danke für die Berichtigung.

              @Thomas:

              Der gepostete Code sollte eigentlich nur aufzeigen, _wie_ eine mögliche Lösung Deiner Aufgabenstellung aussehen könnte, und daß es oft einfacher geht, als Du zuerst annimmst. Für eine 1:1-Kopie ist er eigentlcih nicht gedacht gewesen. Warum, hat Cheatah in seiner, wie immer, trefflichen Art und Weise schon ausgeführt.

              Grüße
                Klaus

              1. Hi,

                Na ja, wenn mir solche Schnitzer passieren, dann bin ich mir nicht so sicher, ob ich immer weiß, was ich da tue:-((

                wenn Du Code postest mag der ungetestet sein, aber er hat Hand und Fuß. Bugs mögen enthalten sein; man kann aber ziemlich sicher sein, dass Du die potentiellen Gefahren bereits bedacht hast.

                Cheatah